【问题标题】:std::list and std::vector - Best of both worlds?std::list 和 std::vector - 两全其美?
【发布时间】:2020-08-19 12:03:52
【问题描述】:

vector vs. list in STL:

  • std::vector:最后的插入是恒定的,摊销的时间,但其他地方的插入是一个代价高昂的 O(n)。

  • std::list:您不能随机访问元素,因此获取列表中的特定元素可能会很昂贵。

我需要一个容器,这样您既可以在 O(1) 时间内访问任何索引处的元素,也可以在 O(1) 时间内在任何索引处插入/删除元素。它还必须能够管理数千个条目。有这样的容器吗?

编辑:如果不是 O(1),一些 X

【问题讨论】:

  • 由于内存行为,std::vector<> 几乎总是最佳选择,无论算法复杂度如何。
  • 关于该主题的一些不错的阅读(以及一些不错的查看链接):stroustrup.com/bs_faq.html#list
  • @super 您是否测试过“它是如此缓慢”的说法,或者您只是基于时间复杂度?它很大程度上取决于平台,但通常至少需要数万或数十万个元素才能使其他容器变得更快。
  • 具体来说,您想做什么?我猜这里还有一些专门用于您的目的的其他数据结构会更有用。
  • @super 没有回答我的问题。您仍然需要填充向量,那么您是否关心该种群期间 或该种群之后 的复杂性?你还没有真正提供任何有用的细节来说明你想如何使用你所寻找的容器。

标签: c++ list vector data-structures containers


【解决方案1】:

a theoretical result 说任何表示有序列表的数据结构都不能拥有所有的插入、按索引查找、删除和更新的时间都比 O(log n / log log n) 好,所以没有这样的数据结构存在。

不过,有些数据结构与此非常接近。例如,order statistics tree 允许您在 O(log n) 的时间内对列表中的任何位置进行插入、删除、查找和更新。这些在实践中相当不错,您可以在线找到实现。

根据您的具体应用,可能会有更适合您需求的替代数据结构。例如,如果您只关心在每个时间点找到最小/最大元素,那么像 Fibonacci heap 这样的数据结构可能适合您。 (斐波那契堆在实践中通常比常规二进制堆慢,但相关的pairing heap 往往运行得非常快。)如果您经常通过添加或减去元素来更新元素范围,那么Fenwick tree 可能是更好的电话。

希望这会有所帮助!

【讨论】:

  • 理论结果+1的荣誉
  • 列表和向量都没有次线性查找,这意味着我们可以牺牲那个。
  • @MooingDuck 我想这取决于“查找”的含义。我假设这是“按索引查找”,在这种情况下,向量在这方面工作,但在插入和删除方面不够快。
  • 哦。然后绝对可以用 logN insert、indexLookup、remove 和 indexUpdate 制作一个容器。我做了一个。
  • 是的!这就是我所指的订单统计树。 (这通常作为平衡 BST 完成,但如果您只使用订单统计树的形状而不是排序功能,您会得到一个序列,其中每个操作都有对数成本。)
【解决方案2】:

看看几个数据结构。

  • The Rope
    数组树。树按数组索引排序,以实现快速索引搜索。
  • B+Tree
    排序数组的排序树。几乎每个数据库都使用过这个东西。

两者都不是 O(1),因为那是不可能的。但它们都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2018-12-16
    • 2014-05-23
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多