调查从二进制搜索中删除密钥必须执行的操作 树。删除总是和插入一样快吗?
我查找了BST中的插入和删除。删除似乎更复杂,因为需要重新路由节点,这也意味着需要重新分配和重新组织密钥。 就速度而言,基于删除的复杂性,我认为这意味着删除不像插入那样快。
这是正确的假设吗?感谢
答案 0 :(得分:1)
虽然最初看起来插入速度可能会更快,但我完全不相信这是真的,至少在很大程度上是这样。
当我们进行插入时,我们总是将新节点作为叶节点的子节点插入。我们必须遍历树到叶节点才能进行插入。
当我们删除时,我们有三种情况需要考虑。最简单的是我们正在删除一个叶子节点。在这种情况下,我们将父叶子节点的指针设置为空指针,然后释放叶子占用的内存。与插入没有任何不同。
如果要删除的节点是具有一个子节点的非叶节点,则该任务只会稍微困难一些:我们将当前节点的父节点设置为指向要删除的节点的子节点,并且(再次) )释放我们正在删除的节点占用的内存。
我们遇到任何可能被视为额外工作的事情的唯一一次是我们必须删除一个有两个子节点的非叶子节点。在这种情况下,我们需要找到一个叶节点,该节点是该节点的子节点 - 它的左子节点的最右侧后代,或其右子节点的最左侧后代。我们将该节点交换到我们正在删除的节点并释放其内存。
这里要记住的是,对于插入,我们首先将树遍历到叶子,然后插入。在删除的情况下,我们可能会在遍历到叶子之前到达节点以删除 - 但即使在最坏的情况下,我们仍然只是继续遍历直到我们到达叶子(无论如何我们要插入的东西),指定指针将该节点移动到被删除的节点的位置。
这里可能会有一两个额外的任务(主要取决于你如何实现),但最多的差异非常小。
从实际的角度来看,任何真正的性能差异都可能归结为一个问题:您正在使用的内存管理是否试图平衡分配和删除的成本,或者是否优先于另一个(以此类推,其中)。
简而言之,根据堆的管理方式,这个的最慢部分可能很好地为节点分配或删除内存,并且树操作基本上在噪声中丢失。