【发布时间】:2012-12-19 09:55:52
【问题描述】:
查看Data.Set 的文档时,我看到了insertion of an element into the tree is mentioned to be O(log(n))。但是,我直觉上希望它是 O(n*log(n))(或者可能是 O(n)?),因为引用透明需要在 O(n) 中创建前一棵树的完整副本。
我知道例如(:) 可以设为 O(1) 而不是 O(n),因为这里不必复制完整列表;编译器可以将新列表优化为第一个元素加上指向旧列表的指针(请注意,这是一个编译器 - 不是语言级别的 - 优化)。但是,将值插入Data.Set 涉及重新平衡,这在我看来相当复杂,以至于我怀疑是否存在类似于列表优化的东西。我尝试阅读the paper that is referenced by the Set docs,但无法用它回答我的问题。
那么:在(纯)函数式语言中,如何将元素插入二叉树是 O(log(n))?
【问题讨论】:
-
它不需要复制整个树——它只需要将节点从根复制到插入节点的位置。在平衡二叉树中会有 log(n) 个。
-
平衡功能,供参考,在这里:hackage.haskell.org/packages/archive/containers/latest/doc/html/… - 注意上面的文档列出了一个更简单的版本。
-
(:)根据定义是 O(1) --- 尽管名字很有趣,但它只是一个简单的构造函数。
标签: haskell complexity-theory referential-transparency