【问题标题】:Do I misunderstand the meaning of exercise 2.65 of SICP?我是否误解了 SICP 练习 2.65 的含义?
【发布时间】:2013-07-08 08:49:19
【问题描述】:

这是SICP的练习2.65:

使用练习 2.63 和 2.64 的结果,给出实现为(平衡)二叉树的集合的并集和交集的 Θ(n) 实现。

在“集合为有序列表”一章和练习 2.62 中,我们已经有了有序列表的并集和交集。我在网上搜索过,2.65的答案太简单了,他们只是将二叉树转换为列表,而有序列表仍然使用并集和交集。

在我看来,我们需要将集合转换为二叉树,并重写二叉树的并集和交集。

那么,我是不是误解了SICP练习2.65的意思?或者有什么好的答案吗?

【问题讨论】:

    标签: scheme sicp


    【解决方案1】:

    在这种情况下,“简单”的答案是正确的:通过首先将树转换为列表(实际上,有序列表,因为我们正在对树进行中序遍历)来解决练习,然后使用有序集过程,最后将结果集转换回树。为什么这是正确的?因为所描述的过程使用已经存在的过程实现了所需的O(n) 复杂性 - 无需重新发明轮子!

    虽然可以通过操纵树来编写“直接”答案,但这太麻烦了,而且在 O(n) 中实现而不使用突变操作将非常棘手(如果不是不可能的话!) - 最多书中的这一点,我们还没有使用set!set-car!set-cdr!

    【讨论】:

    • 是的,这也是我得到的,主要是因为结果树的约束必须是平衡的。如果您使用的是自平衡树(例如红黑),它可能没什么大不了的,但构建平衡树的最简单方法是从有序列表开始。
    【解决方案2】:

    您是对的,您可以使用本文中较早的示例作为指南,为平衡二叉树编写union-setintersection-set 的有效实现。但是,文本明确告诉您使用前两个练习的结果,因此它会引导您找到特定的解决方案。该解决方案(将二叉树转换为列表以将问题简化为已解决的问题)已经是 O(n),无论如何这是您可以解决此问题的最佳顺序。

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2012-07-05
      • 2011-11-05
      • 2017-02-03
      • 2010-12-26
      • 2012-12-15
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多