【发布时间】: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 文件。