【发布时间】:2022-01-18 10:41:09
【问题描述】:
如果我理解正确,在 Haskell 中修改(插入或删除)二叉搜索树需要复制整个树,所以实际上它是 O(n)。有没有办法在 O(log n) 中实现它,或者编译器可能会将 O(n) 插入优化到 O(log n) “在引擎盖下”?
【问题讨论】:
-
是什么让您认为您需要复制整棵树?对于树一般来说,你只需要将路径复制到你插入/删除的节点,即O(log n)。您的 BST 是否有其他限制使这成为不可能?
-
是,你可以插入O(log n)。由于所有数据都是不可变的,因此您可以重用原始树中的节点,从而只更新大小为 O(log n) 的路径。
-
@JörgWMittag 不,我没有具体的树案例 - 一般只是关于 BST 的问题。我想我需要考虑将插入/删除作为一条路径。如果是这样,问题必须重述为 insertion is both time O(log n) and space O(log n)? 而在命令式语言中这将是 时间 O(log n) 和速度 O(1)?.
-
仅当您希望树保持持久,即您希望保留树的旧版本和新版本。如果你不想这样,那么你可以扔掉旧节点,只需要 O(1) 空间。如果您确实想要保留两个版本,那么保留旧版本所需的额外空间为 O(log n) – 请注意,这是您无法做到的命令式语言中的可变树,无需完全复制它。
标签: haskell binary-search-tree complexity-theory