【问题标题】:Heap for fast insertion and deletion O(log n) [closed]堆用于快速插入和删除 O(log n) [关闭]
【发布时间】:2017-06-06 18:08:13
【问题描述】:

我正在尝试找到一种具有以下描述的一些属性的算法:

  • 使用数组作为存储(缓存友好)。
  • 只存储无符号整数。
  • 没有关联的值。
  • 插入和删除第 i 项的时间应为 O(log n) 时间。
  • 保持结构稳定,以便在遍历时删除元素。
  • 单个项目的顺序和查找并不重要,最大值或最小值也不重要。

这类问题有多种解决方案。 一种非常常见的是红/黑树。我不喜欢树来解决这个问题,因为我必须在其他方面使用动态内存(比如存储我不需要的指针和关联值)。

我想到的另一个选项是使用二进制堆。它旨在快速删除最小/最大元素,因此适用于优先级队列。在我的情况下,我需要一些允许删除堆中任意项目的扩展版本。 是否可以在 log(n) 时间内进行删除。网上有人提到,如果您在数组中有位置,就是这种情况。但是我找不到证明这是正确的。 另一件事是删除期间的稳定性。 如果答案是否定的,你有什么建议?

【问题讨论】:

  • 作为否定证明:如果您删除第 n 个元素,则使用数组,您要么必须以某种方式跟踪间隙(不好),要么折叠空间。折叠空间是 Order(n-i) 操作,它倾向于 Order(n/2) 用于随机删除,即 O(n)。有 red/back 方法使用第二个索引数组,可能是 O(log n)。
  • “稳定”是什么意思? “保持结构稳定,以便在遍历时删除元素。”
  • 用法是,在遍历期间(可能正在使用迭代器),可以选择一个项目进行删除。然后遍历可以继续删除项目而不用从头开始。这是一个很好的选择,但可能不需要,但取决于结构和选择的算法。
  • 谢谢,删除取log(n)的K元素证明很好。我会看看其余的 html 文件。

标签: c++ c algorithm search


【解决方案1】:

是的,可以在 O(lg n) 时间内对堆中的随机元素进行删除。

怎么样?假设这是你的堆:

                   4
                 /   \
                10   20
               /  \  ...
              30  40  ...
             /  \   ......
            50  60

假设你想删除 10,然后(因为这是一个 Min-Heap)你得到 10 中最小的孩子并放入他的位置,然后你从 10 的最小孩子(30)开始重新开始,并带来 30 的最小孩子( 50)。

如果您正确构建了堆,则属性将在此方法运行时保留。

其实这只不过是一个不从根开始的Heapify。

        4                    4                    4 
      /   \                /   \                /   \
   [10]   20              30   20              30   20
   /  \   ...    =>      /  \   ...    =>     /  \   ...
  30  40   ...        [30]  40   ...         50  40   ...
 /  \    ......       /  \     ......       /  \    ......
50  60               50  60              [50]  60

【讨论】:

  • 正确,但请注意,它会重新排序数组,因此迭代不稳定,并且您拥有的有关给定元素索引的任何信息都将失效。
【解决方案2】:

如果我正确理解了这个问题,那么您不需要能够按价值查找项目并且您不在乎它们的顺序是什么?

如果是这种情况,那么您应该从头开始将它们放在一个数组中。如果你必须在中间删除一个项目,那么只需将它与项目和结尾交换,然后从那里删除它。

在遍历数组时也很容易做到这一点。当您删除一个项目时,您只是不增加位置,因为下一个要访问的项目已交换到您删除的项目的位置。

【讨论】:

  • 对于我需要的其中一项政策,这是一个完美的解决方案。谢谢!它是 O(1)。我没有看到它这么简单:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多