2012-04-07 230 views
-1

我需要按照字典順序對100,000多個單詞的列表進行合併和排序。我現在用一個稍微修改過的冒泡排序來做,但是在O(n^2)它需要很長時間。有沒有更快的算法來排序單詞列表?我使用Python,但是如果有一種語言可以更好地處理這個問題,我很樂意提供建議。字詞列表的字典排序

+3

任何形式將盡。 – soulcheck 2012-04-07 19:19:43

+0

*如果內存受限,就地訪問 – soulcheck 2012-04-07 19:31:08

回答

7

任何O(nlogn)sorting algorithm可能會做的更好,然後冒泡排序,但他們會O(nlogn * |S|)

然而,排序字符串可以在O(n*|S|)來完成,其中|S|是平均字符串的長度,使用trie,和簡單的DFS

高級別僞代碼:

1. create a trie from your collection. 
2. do a DFS on the trie generated, and add each string 
    to the list when you reach terminal node. 
+0

你知道Python中的任何好的(高效的)trie實現嗎? – Cameron 2012-04-07 19:37:37

+0

@Cameron:我不是一個真正的本地Python用戶,所以我不這樣做。但我相信它存在,它太常見了,python被廣泛用於相信在某處沒有開源實現。 – amit 2012-04-07 19:40:38

11

使用內置sort()列表方法:

>>> words = [ 'baloney', 'aardvark' ] 
>>> words.sort() 
>>> print words 
['aardvark', 'baloney'] 

它採用了O(n lg(n))排序的Timsort(。這是一個修改合併排序,我認爲這是非常適應的速度) 。


如在評論中指出,這是指元件的比較的數量,而不是低級別的操作的數量。由於這種情況下的元素是字符串,並且比較兩個字符串需要min{|S1|, |S2|}個字符比較,所以總複雜度爲O(n lg(n) * |S|),其中|S|是要排序的最長字符串的長度。但是,所有比較排序都是如此 - 操作的真實數量取決於要排序的元素類型的元素比較函數的成本。由於所有比較排序都使用相同的比較函數,所以在比較這些排序的算法複雜性時,您可以忽略這種細微差別。

+1

任何比較對於字符串,排序算法都是'O(nlogn * | S |)',因爲每個比較操作不是'O(1)' – amit 2012-04-07 19:21:26

+0

@amit:True,儘管「| S |」與單詞「n」相比通常很小。嘗試很棒,但構建它們(高效)很棘手,而'sort()'是一個內置的。 – Cameron 2012-04-07 19:26:13

+0

@amit:他們不一定是;如果語言執行字符串interning,字符串相等性測試可以在'O(1)'時間完成。 – ninjagecko 2012-04-07 19:26:31