繁体   English   中英

快速插入的数据结构

[英]Data structure with fast insertion

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

我想到了二项式堆,但是我对这种结构的理解是,在插入过程中它无法告诉特定元素是否在堆中。 另一方面,有一个AVL树,非常适合我的情况,但老实说,那时对我来说实施起来太难了。

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

Grettings :)

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

很好的数据结构是红黑树,该树是用于插入的O(log(n)) 您说过您想实现一个执行此操作的数据结构。 这里给出了如何实现的一个很好的解释,以及一个开源的可用库。

如果您担心线程安全,也可以使用跳过列表。 在这样的情况下,平衡的二进制搜索树比跳过列表的性能要差得多,因为跳过列表不需要重新平衡,并且跳过列表在本质上也像BST一样排序。 所需的内存量有一个缺点(因为技术上使用了多个链表),但是从理论上讲,这是一个很好的选择。

您可以在本教程中阅读有关跳过列表的更多信息。


如果您确实有大量元素,则还可以考虑只使用双向链接列表,然后在插入所有项目之后对列表进行排序。 这具有易于实现和插入时间的优点。

然后,您需要实现排序算法。 与归类排序,堆排序或快速排序算法相比,选择排序或插入排序将更慢但更易于实现。 另一方面,后三个都不是很难实现的。 唯一要注意的是您不会溢出堆栈,因为这些算法通常是使用递归实现的。 您可以创建自己的堆栈实现(这并不困难),然后迭代地实现它们,并根据需要将值压入和弹出到堆栈中。 有关我所指代的示例,请参见迭代快速排序。

如果您可以使用库,则可以在这里查看libavl 该库还实现了其他一些二进制树。

如果您希望快速插入且易于实现,为什么不选择链表(单或双)。 插入:推头/推尾-O(1)移除:弹出头/推尾-O(1) 唯一的“发现”但在O(n)中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM