我正在拼命寻找一个允许我执行大量插入的数据结构,几乎同样多的删除(可能是相同的数量级),并且非常快速地查找最高(或最低,可以和任何一个)价值。 删除将始终仅影响最高(或再次,最低)值。 问题是必须对值进行排序,并且在任何时候我都可以在其他两个之间的任何点插入元素。我希望在任何时候快速阅读(和删除)的唯一值是最大值(或者,再次,最小值)。
你有什么建议吗?
请为您提出的答案提供算法复杂性分析。
答案 0 :(得分:8)
像你需要一个Max-Heap。
支持O(log n)插入,O(1)查找最大值和O(log n)删除最大值。
答案 1 :(得分:4)
堆是你想要的。这是二进制堆的简单实现。它是最大堆还是最小堆取决于您传递给它的比较函数:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=789
请注意,二进制堆不是构建堆的唯一方法。但它可能是最容易构建的,并且在大多数情况下表现都很好。
虽然订购了它们,但堆中的项目没有排序。唯一的保证是最高(最低)的项目位于堆的顶部,并且是当您要求下一个项目时检索到的项目。
您正在构建的内容听起来像priority queue。还有其他方法可以实现优先级队列。例如,我看到基于skip list的优先级队列优于基于堆的优先级队列。
如果您确实需要插入O(1),请查看Fibonacci heap。
之类的内容答案 2 :(得分:1)
此数据结构称为self-balancing binary search tree,它使用我使用的每种语言实现,Borland Pascal除外。
您提到的所有操作(添加/删除/查找)的成本为O(logn)
。最小 - 最大查找也可以是O(1)
。
您可以在O(n)
中按排序顺序遍历所有元素。
修改强>
我不是建议堆,因为它不满足“必须排序”的要求。
如果你需要插入/删除/查找 only max ,那么我建议排序数组或链表。最大插入/删除/查找O(1)
以及所有元素已经排序。