2009-10-17 43 views
2

創建詞典樹的複雜性是什麼?創建詞典樹的複雜性是什麼

+3

你打算在這裏發表所有的作業題嗎? – 2009-10-17 03:13:08

+1

如果Test可以提供一個合適的字典順序定義,那麼它不會從http://en.wikipedia.org/wiki/Lexicographically或某個類似的網站上被竊取;-) – DaveParillo 2009-10-17 03:23:22

回答

1

適當的數據結構可能是一個排序列表。在這種情況下,這變成了二分搜索問題,所以O(log n)。

+0

+1由於給出了一個排序列表,前面,這可能是正確的(即他的教授正在尋找的答案:-) – 2009-10-17 03:25:06

-1

只是運行一個簡單的循環,並檢查每個單詞是否以任何開頭。

幾乎在每種語言中都有一個構建函數用於檢查一個字符串是否以另一個字符串開頭。

複雜度是O(log n),而n是詞典中單詞的數量。

+3

一個簡單的循環將是O(n)。 – 2009-10-17 03:22:38

+0

但你只要找到 – Letterman 2009-10-17 15:22:33

+1

就停下來,這意味着你必須平均掃描一半的列表,這使得O(0.5n)是O(n)。 – 2009-10-19 08:38:36

2

如果您在輸入中創建了prefix tree,則可以在恆定時間內執行此查詢。

編輯

該查詢是在搜索字符串的長度是線性的。我的意思是說,關於單詞列表的大小是不變的。

0

正如上面提到的Gabe Trie是一個很好的解決方案,但對於有大量單詞的字典實現起來有點困難。如果O(n log n)算法適合你,你可以用二分查找來解決這個問題。這裏是用C編寫的代碼:

 
char dict[n][m]; // where n is number of words in dictionary and 
       // m is maximum possible length of word 
char word[m]; // it's your word 

int l = -1, r = n; 
while(l+1 < r) { 
    int k = (l+r)/2; 
    if(strcmp(dict[k], word) < 0) l = k; 
    else r = k; 
} 

int len = strlen(word); 
l++; // first word's index with greater or equal prefix then word is l+1 
bool matches = (strlen(word[l]) >= len); 
for(int i = 0; i < len && matches; i++) { 
    if(word[i] != dict[l][i]) { 
    matches = 0; 
    } 
} 

if(matches) { 
    printf("given word is prefix of %dth word.", l); 
} else { 
    printf("given word isn't in dictinary."); 
} 
+1

用二進制搜索找到字典中的單個單詞不是O(n log n)!它是O(log n)。 – 2009-10-17 11:10:29