【问题标题】:Is there a data structure representing an ordered list with O(n*log n) time on main operations?是否有表示主要操作时间为 O(n*log n) 的有序列表的数据结构?
【发布时间】:2019-04-29 19:57:04
【问题描述】:

我正在寻找一种允许以 O(n*log(n)) 复杂度解决特定问题的数据结构。它需要表示一组整数,我可以在其中执行以下操作: - 添加一个元素 - 检查集合中是否存在元素 - 删除每个大于给定整数的值 希望具有对数复杂度。

我寻找链表是因为在中间添加一个元素并删除整个结构的一部分很容易,但我不知道如何保持有序列表或实现二分搜索。起初我正在考虑哈希表,但我不知道如何过滤集合。我正在查看平衡二叉树,但我不知道我是否在寻找妄想的东西,或者它是否以某种方式存在但我找不到它。

【问题讨论】:

  • 考虑使用priority queue
  • @jhill515 优先级队列不允许您在小于线性的时间内检查是否存在。
  • 实际上,是的,因为搜索是 O(log(n))。
  • @jhill515 查看离您最近的参考手册。这是我预测你会发现的。优先级队列最常见的实现是堆。堆有时间 O(1) 找到最小元素,O(log(n)) 添加/删除到堆,有时间 O(n) 在堆中搜索给定元素。
  • 理论上可以从具有不同属性的数据结构中构建优先级队列。例如,优先级队列可以由带有少量信息的红黑树构建而成。但现在它执行如你所愿的事实是因为它是一棵红黑树,而不是因为它是一个优先级队列。 (并且对于优先级队列操作,您的平均速度会比堆慢 - 这就是更常用堆的原因。)

标签: algorithm list sorting set structure


【解决方案1】:

对于从头开始实施,我建议Treap

Treap 只是一棵二叉搜索树,其中每个节点都被赋予随机优先级,并且它作为树满足堆条件。这种随机数据结构使得查找、插入、删除和拆分树的预期时间为O(log(n))。前三个相当简单。要拆分,您只需在要拆分的点上放置一个节点,其优先级高于根。然后一半在该节点的一侧结束,另一半在另一侧。

请注意,虽然拆分是O(log(n)),但释放删除的位是O(n)

请注意,您可能不必执行任何操作。例如,在 C++ 中,您可以只使用 std::map。除删除之外的那些操作的性能是O(log(n))。从大小为n 的结构中删除长度为m 的范围是O(m + log(n))。如果您考虑有关释放内存的评论,那就太理想了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多