搜索和排序向量的最快方法

时间:2014-05-08 17:11:45

标签: c++

我正在做一个项目,我需要将数据插入到矢量中对其进行排序并搜索...

我需要最快的排序和搜索算法...我一直在搜索并发现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(..);
}

6 个答案:

答案 0 :(得分:10)


  

  
      
  • 快速排序是最快的排序方法之一。      
        
          

    答案:不完全。通常它保持(即,在平均情况下,快速排序具有enter image description here复杂度。但是,快速排序具有二次最坏情况性能(即enter image description here)。此外,对于少量输入(例如,如果你有一个std::vector具有少量元素),使用快速排序的排序往往会比其他排序算法实现最差的性能,这些排序算法被认为"更慢&# 34; (见下图):

        
      
  •   

enter image description here


  
      
  • 我无法弄清楚哪种搜索算法最好。它是二进制搜索吗?      
        
          

    答案: Binary search具有相同的平均和最差情况(即enter image description here)。还要记住,二进制搜索要求容器应按升序或降序排列。但是,是否优于其他搜索方法(例如,具有enter image description here时间复杂度的linear search)取决于许多因素。其中一些是:

                 
            
    1. 元素/对象的数量(见下图)。
    2.       
    3. 元素/对象的类型。
    4.            
      
  •   

enter image description here


  

底线:

     

答案 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(...)