![](/img/trans.png)
[英]Data structure in c for fast look-up/insertion/removal of integers (from a known finite domain)
[英]Data structure with fast insertion
我想实现一种数据结构,该结构能够在每次插入后快速插入并保持数据排序,而不重复。
我想到了二项式堆,但是我对这种结构的理解是,在插入过程中它无法告诉特定元素是否在堆中。 另一方面,有一个AVL树,非常适合我的情况,但老实说,那时对我来说实施起来太难了。
所以我的问题是:是否有可能编辑二项式堆插入算法以跳过重复项? 也许任何人都可以建议其他结构吗?
Grettings :)
在C ++中,有std::set
。 它在内部是红黑树的实现。 因此,当您输入数据时,它将进行排序。您可以参考一下。
很好的数据结构是红黑树,该树是用于插入的O(log(n))
。 您说过您想实现一个执行此操作的数据结构。 这里给出了如何实现的一个很好的解释,以及一个开源的可用库。
如果您担心线程安全,也可以使用跳过列表。 在这样的情况下,平衡的二进制搜索树比跳过列表的性能要差得多,因为跳过列表不需要重新平衡,并且跳过列表在本质上也像BST一样排序。 所需的内存量有一个缺点(因为技术上使用了多个链表),但是从理论上讲,这是一个很好的选择。
您可以在本教程中阅读有关跳过列表的更多信息。
如果您确实有大量元素,则还可以考虑只使用双向链接列表,然后在插入所有项目之后对列表进行排序。 这具有易于实现和插入时间的优点。
然后,您需要实现排序算法。 与归类排序,堆排序或快速排序算法相比,选择排序或插入排序将更慢但更易于实现。 另一方面,后三个都不是很难实现的。 唯一要注意的是您不会溢出堆栈,因为这些算法通常是使用递归实现的。 您可以创建自己的堆栈实现(这并不困难),然后迭代地实现它们,并根据需要将值压入和弹出到堆栈中。 有关我所指代的示例,请参见迭代快速排序。
如果您希望快速插入且易于实现,为什么不选择链表(单或双)。 插入:推头/推尾-O(1)移除:弹出头/推尾-O(1) 唯一的“发现”但在O(n)中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.