快速插入的数据结构

时间:2015-06-27 12:22:03

标签: c algorithm data-structures binomial-heap

我想实现一种数据结构,它能够在每次插入后快速插入并保持数据排序,无需重复。

我考虑过二项式堆,但我对该结构的理解是它在插入期间无法判断特定元素是否在堆中。另一方面,有AVL树,它完全适合我的情况,但老实说,在那一刻,对我来说实施起来相当困难。

所以我的问题是:编辑二项式堆插入算法是否有可能跳过重复?也许任何人都可以建议另一种结构?

Grettings:)

5 个答案:

答案 0 :(得分:2)

在C ++中,有std::set。它在内部是红黑树的实现。因此,当您输入数据时它将进行排序。您可以查看它以供参考。

答案 1 :(得分:1)

一个很好的数据结构是红黑树,O(log(n))用于插入。你说你想实现这样做的数据结构。给出了here以及开源可用库的详细解释。

答案 2 :(得分:0)

如果您关心线程安全,也可以使用跳过列表。在跳过列表不需要重新平衡的情况下,平衡二进制搜索树将比跳过列表执行得更差,并且跳过列表也固有地像BST一样排序。所需的内存量有一个缺点(因为技术上使用了多个链表),但从理论上讲它很适合。

您可以在this tutorial中详细了解跳过列表。

如果您拥有真正大量的元素,您可能还会考虑使用双向链接列表并在插入所有项目后对列表进行排序。这样做的好处是易于实现和插入时间。

然后,您需要实现排序算法。选择排序或插入排序比mergesort,heapsort或quicksort算法更慢但更容易实现。另一方面,后三者也非常难以实施。唯一需要注意的是,您不会溢出堆栈,因为这些算法通常使用递归来实现。您可以创建自己的堆栈实现(并不困难)并迭代地实现它们,根据需要将值推送并弹出到堆栈中。有关我所指的内容的示例,请参阅Iterative quicksort。

答案 3 :(得分:0)

如果您可以使用图书馆,可以查看libavl Here 该库还实现了一些其他种类的二叉树。

答案 4 :(得分:-1)

如果您正在寻找快速插入和简单实现,为什么不链接列表(单或双)。 插入:推头/推尾 - O(1) remove:pop head / pop tail - O(1) 唯一的BUT是“查找”将在O(n)