【问题标题】:Data structure with fast insertion快速插入的数据结构
【发布时间】:2015-06-27 12:22:03
【问题描述】:

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

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

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

问候 :)

【问题讨论】:

  • 有多少元素?如果元素的数量不是很大,我会先尝试一个数组。其出色的缓存位置属性使其成为一个不错的默认选择。
  • 元素的数量可能很大,所以数组不是很好的选择。
  • 虽然insertionwithout duplicates 确实限制了建议自己的选择,但我建议明确编译要支持的操作列表,包括对资源消耗的要求。 (remove, min, nth(根据订单),average, count...呢?)

标签: c algorithm data-structures binomial-heap


【解决方案1】:

在 C++ 中,有std::set。它在内部是红黑树的实现。所以当你输入数据时它会排序。你可以看看它以供参考。

【讨论】:

  • 感谢您的关注。我有义务只使用 c 库,并且不使用外部数据结构。
  • @Michocio 我只是为你指出一个参考,而不是要求使用 std::set
  • @Steephen 即使禁止现成的集合实现,您也可以自己实现。根据定义,集合仅包含唯一项,这使得二叉树成为底层数据结构的绝佳选择。这将是速度的自平衡(例如红黑或 AVL),但可以在您已经完成基本实现之后进行平衡。您的插入算法与普通二叉树的唯一区别在于,您必须在插入之前检查以确保该项目不存在,因为每个项目都必须是唯一的。
【解决方案2】:

一个很好的数据结构是红黑树,它是O(log(n)) 用于插入。你说你想实现一个数据结构来做到这一点。 here 很好地解释了如何实现它,以及一个开源可用的库。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      您可以在this tutorial 中阅读有关跳过列表的更多信息。


      如果您有大量的元素,您也可以考虑只使用双向链表并在插入所有项目后对列表进行排序。这具有易于实现和插入时间的好处。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 一般来说,您对实施速度和易用性的看法是正确的。但是,列表必须保持排序,因此将3 插入列表1,2,4 将使列表1,2,3,43,1,2,41,2,4,3 不可接受。)
        • 那么......堆栈怎么样? 您必须从一开始就知道容量,但您可以每次都进行排序插入,因此实际上它保持排序。也很容易实施。
        • 非常感谢您的回答!刚看完你的帖子,我突然想到了一个主意。有没有可能在链表上制作 binserach?我知道这通常是为数组制作的,但也许 c 中有任何黑客提示,并且可以在链接(甚至是双链接)列表上实现 bin serach?
        • 可能仅在使用与基于数组的堆中相同的算法时。如果头部位置 = 0,则左孩子在 2*i+1,右孩子在 2*i。您必须计算要进行多少“下一次跳跃”
        • 如前所述......具有非常明显的缺点;-P
        猜你喜欢
        • 2015-11-10
        • 2011-07-09
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        相关资源
        最近更新 更多