【问题标题】:What is the fastest data structure (and sorting algorithm) to sort a set of numbers? [closed]对一组数字进行排序的最快数据结构(和排序算法)是什么? [关闭]
【发布时间】:2023-07-29 13:50:01
【问题描述】:

我需要一个可以保存一组数字并尽可能快地对它们进行排序的数据结构。

我认为列表会很好,因为在列表中插入一个新数字会比向量更容易(这需要在插入后复制元素)。但是,遍历链表(我使用排序列表作为查找从 unordered_map 中获取对象)可能会慢得多,因为内存分散在整个堆中。

我在考虑使用地图,但是由于不连续性,这不会也有不好的内存访问吗?

静态分配的数组(有很多空白空间)和快速排序算法是我想到的另一个想法.....

回顾一下——我需要一个允许我插入新元素并尽快重新排序元素的数据结构。元素将是数字。

有什么帮助吗?

【问题讨论】:

  • 请参阅this question,了解如何选择您的标准容器。
  • 这很难回答,因为 fastest 不仅取决于 big-O 复杂性,还取决于常数项(即带有坏 big-O 的数据结构可能会胜过“较小”输入尺寸的“更好”)。只有具有真实数据的基准才能告诉您什么是“更好”,因为“小”通常可能非常大。

标签: c++ list sorting vector map


【解决方案1】:

最快的数据结构是数组-连续的内存区域,最适合缓存。

排序取决于。快速排序与插入排序的组合用于对低于特定大小的子数组进行排序可能是您最好的选择,而无需求助于更深奥的东西。

【讨论】:

    【解决方案2】:

    您可能想考虑如何将这些对象存储到您的vector/map 中。带有必要的比较函子的智能指针可能就是您想要的。

    【讨论】:

    • 我只是存储原语?我想要的只是一个存储容器来存储排序的数字并允许我插入/迭代它们。
    【解决方案3】:

    如果“数字集”是指每个数字只出现一次,并且希望对其进行排序,请使用 std::set。老实说,除非您处理大量数据,否则 std::list 甚至 std::vector 可能就足够了。

    【讨论】:

      【解决方案4】:

      Boost.Containers 库包含 flat_set 数据结构。它在std::vector 数据存储之上实现了std::set 接口。根据文档的优势

      • 比标准关联容器更快的查找
      • 迭代速度比标准关联容器快得多
      • 小对象的内存消耗更少(如果使用了 shrink_to_fit,对于大对象)
      • 提高缓存性能(数据存储在连续内存中)
      • 不稳定的迭代器(插入和擦除元素时迭代器失效)
      • 无法存储不可复制和不可移动的值类型
      • 比标准关联容器更弱的异常安全性(复制/移动构造函数在擦除和插入中移动值时可能抛出)
      • 插入和擦除比标准关联容器慢(特别是对于不可移动的类型)

      【讨论】:

        【解决方案5】:

        最快的数据结构是什么

        一个数组。

        (和排序算法)

        快速排序,前提是您可以容忍最坏情况的行为。否则可能是堆排序。

        【讨论】:

        • @downvoters 这真是不可思议。这是数据结构 101。你甚至没有暗示你为什么不同意。
        • 没有投反对票,但我认为如果没有更多细节,这个问题是无法回答的(例如,即使是 bogosort 也会胜过你在某些输入上提到的两种算法)。
        最近更新 更多