我正在对Standard库中的搜索和排序算法进行一些研究。关于这些问题,我找不到任何东西。我希望有人能帮助我。如果您知道链接,也可以向我发送链接。
与未排序的数据相比,如果不对数据进行排序,搜索行为是否会发生变化?
如何知道在向量上使用std::sort()
而不是将向量复制到已经排序的集合上是否更好?那只是一个例子。我希望在网络上找到一些解释,哪种方式最适合搜索或排序,但我没有。
如何调整搜索和排序算法的行为以使其更高效?
答案 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
更改了容器,因此显然可以对结果进行排序。如果您需要原始的,无序的容器,请进行复印并分类。对所有容器进行分类最好比对所有项目都“总是对容器插入项目排序”,特别是带有向量的容器(许多内存重新分配);设置/地图填充过程可能不会那么慢。
如何调整搜索和排序算法的行为 使其更有效率?
我不清楚您的意思。但是,“最终证明手段”。再次,选择最适合您的数据处理的容器。