2014-05-08 102 views
3

我在做一個項目,我需要將數據插入到載體中的排序和查找它...的最快方法載體

我需要最快的排序和搜索算法可能我...我一直在搜索,發現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

二進制搜索是標準的「快」搜索桶排序算法對於一個數組或向量 – wheybags

+0

使用std :: sort並在std :: binary_search之後就可以了。 – 101010

+1

是否必須對矢量進行排序,或者是否可以使用另一個(未排序的)帶有攤銷O(1)的數據結構? – Deduplicator

回答

9


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

    答:不太。一般來說,它是成立的(即,在平均情況下,快速排序的複雜性爲enter image description here)。然而,快速排序具有二次最壞情況表現(即,enter image description here)。此外,對於少量輸入(例如,如果您有一個帶有少量元素的std::vector),快速排序的排序往往會比被認爲「更慢」的其他排序算法實現最差的性能(參見下圖):

enter image description here


  • 我找不出哪個搜索算法是最好的。它是二進制搜索嗎?

    答案:Binary search具有相同的平均值和最差情況下的性能(即,enter image description here)。還要記住,二進制搜索要求容器應按升序或降序排列。然而,是否優於其他搜索方法(例如,具有enter image description here時間複雜度的linear search)取決於許多因素。其中一些是:

    1. 元素/對象的數量(見下圖)。
    2. 元素/對象的類型。

enter image description here


底線:

+0

好點但恕我直言過分簡化了這個問題。元素數量不僅是影響分揀速度的因素。 – Slava

+0

@Slava非常感謝,儘管我也提到了「其他因素」。 – 101010

+0

使用'std :: lower_bound'來搜索你的'std :: vector'。 'binary_search'只是告訴你一個元素存在。此外,您的排序圖使得它看起來像二元搜索對於所有數量的元素都更快。放大一點,小數字並不總是最好的。 –

1

如果你需要最快或最好的排序算法...有沒有這樣的一個。至少它還沒有被發現。有一些算法可以爲不同的數據提供更好的結果,有些算法可以爲大多數數據提供良好的結果。你或者需要分析你的數據併爲你的案例找到最好的數據,或者使用類似std :: sort的通用算法,並期望它提供好的結果,但不是最好的結果。

2

對於分攤的O(1)訪問時間,請使用[std::unordered_map],也許使用自定義哈希以獲得最佳效果。
排序似乎是不必要的額外工作。

2

搜索和排序效率高度依賴於數據的類型,原始數據的排序,並且該數據的數量。

例如,對於小的排序數據集,線性搜索可能比二進制搜索更快;或者兩者之間的時間差異可以忽略不計。

某些排序算法會對反序數據執行可怕的反應,如二叉樹排序。數據變化不大可能會導致散列算法發生高度的衝突。

也許你需要回答更大的問題:搜索還是排序程序中的執行瓶頸?配置文件並找出。