我正在做一个项目,我需要将数据插入到矢量中对其进行排序并搜索...
我需要最快的排序和搜索算法...我一直在搜索并发现std :: sort基本上是quicksort,这是最快的排序之一,但我无法弄清楚哪种搜索算法是最好的? ??的binarySearch你可以帮我吗? tnx ...所以我有3种方法:
void addToVector(Obj o)
{
fvector.push_back(o);
}
void sortVector()
{
sort(fvector.begin(), fvector().end());
}
Obj* search(string& bla)
{
//i would write binary search here
return binarysearch(..);
}
答案 0 :(得分:10)
- 我一直在搜索,发现基本上是
std::sort
快速排序强>答案:不完全。大多数实现使用hybrid algorithm之类的 introsort,其中包含quick-sort,heap-sort和insertion sort。
- 快速排序是最快的排序方法之一。
答案:不完全。通常它保持(即,在平均情况下,快速排序具有复杂度。但是,快速排序具有二次最坏情况性能(即)。此外,对于少量输入(例如,如果你有一个
std::vector
具有少量元素),使用快速排序的排序往往会比其他排序算法实现最差的性能,这些排序算法被认为"更慢&# 34; (见下图):
- 我无法弄清楚哪种搜索算法最好。它是二进制搜索吗?
答案: Binary search具有相同的平均和最差情况(即)。还要记住,二进制搜索要求容器应按升序或降序排列。但是,是否优于其他搜索方法(例如,具有时间复杂度的linear search)取决于许多因素。其中一些是:
- 元素/对象的数量(见下图)。
- 元素/对象的类型。
醇>
底线:
通常寻找最快的"算法表示过早优化,并根据其中一个"伟大的" (过早优化是所有邪恶的根源 - Donald Knuth )。最快的",我希望它已经清楚地显示出来,取决于很多因素。
- 进行排序
在对
std::vector
使用std::binary_search
进行排序后,找出您的std::vector
中是否存在某个元素,或使用std::lower_bound
或std::upper_bound
查找并从std::vector
获取元素。
答案 1 :(得分:2)
对于摊销的O(1)访问时间,请使用[std::unordered_map]
,也可以使用自定义哈希来获得最佳效果。
排序似乎是不必要的额外工作。
答案 2 :(得分:2)
搜索和排序效率在很大程度上取决于数据类型,原始数据的排序和数据量。
例如,对于小型排序数据集,线性搜索可能比二进制搜索更快;或者两者之间的时差可以忽略不计。
某些排序算法会对逆序数据执行可怕的操作,例如二叉树排序。没有太多变化的数据可能会导致哈希算法的高度冲突。
也许你需要回答一个更大的问题:在我的程序中搜索或排序执行瓶颈?简介并找出答案。
答案 3 :(得分:1)
如果您需要最快或最好的排序算法......没有这样的算法。至少它还没有找到。有些算法可以为不同的数据提供更好的结果,有些算法可以为大多数数据提供良好的结果。你要么需要分析你的数据并找到最适合你的数据,要么使用像std :: sort那样的通用算法,并期望它能提供良好的结果,但不是最好的。
答案 4 :(得分:0)
如果你的元素是整数,你应该使用桶排序算法,它运行在O(N)时间而不是O(nlogn)平均情况,如qsort [http://en.wikipedia.org/wiki/Bucket_sort]
答案 5 :(得分:0)
如果您想了解向量中整数值的最快排序技术,那么建议您参考以下链接: https://github.com/fenilgmehta/Fastest-Integer-Sort
它对大数组使用基数排序和计数排序,对小数组使用合并排序和插入排序。 据统计,这种排序算法比C ++ std :: sort的整数值要快得多。
对于“ int64_t array [10000000]”,它比C ++ STL std :: sort快6倍
如果您想知道向量中是否存在特定值,则应使用binary_search(...)
如果您想知道元素的确切位置,请使用lower_bound(...)和upper_bound(...)