有关搜索和排序算法的问题

时间:2018-11-06 17:01:13

标签: c++ sorting search std c++-standard-library

我正在对Standard库中的搜索和排序算法进行一些研究。关于这些问题,我找不到任何东西。我希望有人能帮助我。如果您知道链接,也可以向我发送链接。

  • 与未排序的数据相比,如果不对数据进行排序,搜索行为是否会发生变化?

  • 如何知道在向量上使用std::sort()而不是将向量复制到已经排序的集合上是否更好?那只是一个例子。我希望在网络上找到一些解释,哪种方式最适合搜索或排序,但我没有。

  • 如何调整搜索和排序算法的行为以使其更高效?

2 个答案:

答案 0 :(得分:1)

  

与未排序的数据相比,未排序的搜索行为是否会改变?

不。这取决于您选择的算法。常规搜索std::find为O(n),二进制搜索std::lower_bound为O(log n),但它仅适用于排序范围。

  

我怎么知道在向量上使用std :: sort()而不是将向量复制到已经排序的集合上是否更好?那只是一个例子。我希望在网络上找到一些解释,哪种方式最适合搜索或排序,但我没有。

您可以编写基准和度量。您可以将std::vector(没有重复的元素)进行排序,方法是将其复制到std::set中,以在内部维护排序顺序。 std::set通常实现为红黑树,与连续的std::vector相比,通常具有高内存碎片。因此很容易预测结果。亚历山大·斯蒂芬诺夫(Alexander Stepanov)在YouTube上的演讲中讨论了这个示例(如果我没记错的话)。

答案 1 :(得分:1)

  

如果未对数据进行排序,搜索行为是否会发生变化   到一个排序的?

取决于。如果按位置访问向量/数组中的数据,则不会提高性能,也不需要对两者进行排序。

搜索可以线性进行 binary keys 和通过 hash函数进行。

对于小型(我猜是几十个项目以下的东西)和连续的容器(例如矢量)而言,线性搜索可能是最快的,这仅仅是因为缓存友好的内存布局。

二进制搜索的复杂度为O(log N),这可能是您可以获得的最好的……我在Information theory中正在考虑。它要求您先对容器进行排序。对于在同一容器中进行频繁搜索非常有用。

std::set(及其堂兄std::map)在内部使用一棵树,这也使得搜索O(log N)的复杂性成为可能。如果您通过键而不是项目的某些条件进行搜索,则很有用。缺点是,构建(始终保持排序)要比填充矢量再进行排序要慢一些。

哈希表或哈希表使用一个函数来获取项目所在的存储桶。复杂度接近O(1),具体取决于项数和使用的功能(冲突问题)。

如您所见,选择一种容器类型取决于您如何处理数据。选择一个符合您要求的产品。

  

我怎么知道在向量上使用std :: sort()是否更好   可能将向量复制到已经排序的集合中?

std::sort更改了容器,因此显然可以对结果进行排序。如果您需要原始的,无序的容器,请进行复印并分类。对所有容器进行分类最好比对所有项目都“总是对容器插入项目排序”,特别是带有向量的容器(许多内存重新分配);设置/地图填充过程可能不会那么慢。

  

如何调整搜索和排序算法的行为   使其更有效率?

我不清楚您的意思。但是,“最终证明手段”。再次,选择最适合您的数据处理的容器。