簡體   English   中英

最有效的排序算法,適用於大量數字

[英]Most efficient sorting algorithm for a large set of numbers

我正在開展一個大項目,我不打算在這里總結一下,但是這個項目的部分是采用一個非常大的文本文檔(最少約50,000個單詞(不是唯一的)),並輸出每個獨特的按照最常用的順序排列的單詞(可能排在前三位的是“a”“an”和“the”)。

我的問題當然是,最好的排序算法是什么? 我正在閱讀計數排序,我喜歡它,但我擔心的是,與獨特單詞的數量相比,值的范圍會太大。

有什么建議?

首先,您需要一個單詞地圖 - > count。 50,000字不多 - 它很容易適合記憶,所以沒什么好擔心的。 在C ++中,您可以使用標准STL std :: map。

然后,一旦有了地圖,就可以將所有地圖鍵復制到矢量中。

然后,使用自定義比較運算符對此向量進行排序:不是比較單詞,而是比較地圖中的計數。 (不要擔心特定的排序算法 - 您的數組不是那么大,因此任何標准庫排序都適合您。)

我從一個快速入口開始,然后從那里開始。

查看排序算法維基頁面 ,了解差異。

您應該嘗試MSD基數排序。 它將按字典順序對您的條目進行排序 這是您可能感興趣的Google代碼項目

看看鏈接。 關於不同算法如何工作的圖示表示。 這會給你一個提示!

排序算法

假設如果兩個單詞出現的次數相同,那么你可以獲得比quicksort更好的性能,那么輸出它們的順序並不重要。

第一步:創建一個哈希映射,其中的單詞為鍵值,頻率為關聯值。 在解析文件時,您將填充此哈希映射。 在執行此操作時,請務必跟蹤遇到的最高頻率。 該步驟是O(n)復雜度。

第二步:創建一個列表,其條目數等於第一步中的最高頻率。 此列表中每個插槽的索引將包含頻率計數等於索引的字的列表。 因此,文檔中出現3次的單詞將列在列表[3]中。 迭代哈希映射並將單詞插入列表中的相應位置。 該步驟是O(n)復雜度。

第三步:反向遍歷列表並輸出所有單詞。 該步驟是O(n)復雜度。

總的來說,該算法將在O(n)時間內完成您的任務,而不是快速排序所需的O(nlogn)。

在我測試過的幾乎所有情況下,Quicksort都為我做了最好的工作。 但是,我確實有兩個案例,其中Combsort是最好的。 可能是因為代碼太小,或者由於數據的有序排序有些怪癖,因此在這些情況下,combsort更好。

任何時候排序顯示在我的個人資料中,我嘗試主要的種類。 我從未有過任何超過Quicksort和Combsort的東西。

您還可以嘗試實現也稱為Trie的數字樹。 這是鏈接

我想你想做一些事情,如下面的帖子所解釋:

http://karephul.blogspot.com/2008/12/groovy-closures.html

支持閉包的語言使得解決方案變得非常容易,就像Eric提到的LINQ一樣。

對於大型集合,您可以在信息檢索中使用所謂的“基於排序的索引”,但對於50,000個單詞,您可以使用以下內容:

  • 將整個文件讀入緩沖區。
  • 解析緩沖區並使用struct token {char * term,int termlen; term是指向緩沖區中單詞的指針。
  • 按術語(詞典順序)對表進行排序。
  • 設置entrynum = 0,遍歷術語向量,當term為new時,將其存儲在向量中:struct {char * term; int頻率; }在index entrynum處,將頻率設置為1並增加條目號,否則增加頻率。
  • 按頻率按降序對矢量進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM