【问题标题】:Binary Search Tree - Deletion vs Insertion. Which is 'faster'?二叉搜索树 - 删除与插入。哪个“更快”?
【发布时间】:2018-08-13 13:46:53
【问题描述】:

调查从二分搜索中删除键必须发生的情况 树。删除总是和插入一样快吗?

我在 BST 中查找了插入和删除。删除似乎更复杂,因为需要重新路由节点,这也意味着需要重新分配和重新组织密钥。 就速度而言,基于删除的复杂性,我假设这意味着删除不如插入快

这是一个正确的假设吗?谢谢

【问题讨论】:

  • 计算机科学家定义复杂性的方式,“删除的复杂性”与插入一样快。不过,平均而言,常数因子肯定比插入情况大。

标签: performance binary-search-tree insertion


【解决方案1】:

虽然最初看起来插入应该更快,但我完全不相信这是真的,至少在很大程度上是这样。

当我们进行插入时,我们总是将新节点作为叶节点的子节点插入。我们必须遍历树到叶子节点来进行插入。

当我们进行删除时,我们需要考虑三种情况。最简单的是我们正在删除一个叶节点。在这种情况下,我们将父节点指向该叶节点的指针设置为空指针,并释放该叶节点占用的内存。与插入并没有什么不同。

如果要删除的节点是一个有一个子节点的非叶子节点,任务只是稍微困难一点:我们将当前节点的父节点设置为指向要删除节点的子节点,并且(再次) 释放我们要删除的节点所占用的内存。

我们遇到的唯一一次可能被认为是额外工作的情况是当我们必须删除一个有两个子节点的非叶节点时。在这种情况下,我们需要找到一个叶子节点,它是该节点的子节点——要么是其左子节点的最右边的后代,要么是其右孩子的最左边的后代。我们将该节点交换到我们正在删除的节点的位置并释放它的内存。

这里要记住的是,对于插入,我们首先将树遍历到叶子,然后插入。在删除的情况下,我们有可能到达要删除的节点一直遍历到叶子之前-但即使在最坏的情况下,我们仍然会继续遍历直到到达叶子(无论如何我们为插入做的事情),分配指针将该节点移动到被删除的位置。

这里可能会有一两个额外的任务(主要取决于你如何实现),但最多差异非常小。

从实际的角度来看,任何真正的性能差异都可能归结为一个问题:您使用的内存管理是尝试平衡分配和删除的成本,还是偏向于另一个(当然,其中)。

简而言之,根据你的堆管理方式,这个可能最慢的部分是为节点分配或删除内存,而树的操作基本上被淹没在噪音中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多