用于快速插入/删除和排序的数据结构

时间:2011-03-06 00:17:53

标签: algorithm performance data-structures tree big-o

我正在拼命寻找一个允许我执行大量插入的数据结构,几乎同样多的删除(可能是相同的数量级),并且非常快速地查找最高(或最低,可以和任何一个)价值。 删除将始终仅影响最高(或再次,最低)值。 问题是必须对值进行排序,并且在任何时候我都可以在其他两个之间的任何点插入元素。我希望在任何时候快速阅读(和删除)的唯一值是最大值(或者,再次,最小值)。

你有什么建议吗?

请为您提出的答案提供算法复杂性分析。

3 个答案:

答案 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)以及所有元素已经排序。