簡體   English   中英

什么是遍歷大詞典的最佳方式?

[英]whats the best way to traverse a large dictionary of words?

讓我說我正在尋找一個可能或可能不在95k字詞典中的單詞 - 我不能使用單詞長度來方便搜索。 我的問題是在沒有進行O(n)查找的情況下找到單詞的最快方法。

這是我的兩個想法:

首先,將單詞存儲在hast表中,查找單詞是O(1),這似乎是我心目中最好的情景,但是也有人建議使用Trie通過不同的網站,我的問題是是否實用有一個擁有這么多單詞的特里。 在這種情況下,查找將是O(k)。

那么在大字典中查找單詞的最佳方式是什么?

最佳性取決於您的使用案例 - 您是否關心查找正常運行時間或空間? (另外,你是否關心插入新詞?)。

你可以做的最好的時間是使用哈希表,但對於字典,它是空間效率低的。 trie壓縮空間要求,因為它存儲前綴,而不是整個單詞,但需要更長時間才能查找。 因此,為了回答你的問題,擁有一個包含大量單詞而不是哈希表的trie更節省空間。

如果您只是搜索單個單詞,則設置哈希表或樹結構的成本將超過線性搜索。 當這些結構的成本在(非常)許多用途上攤銷時,這些結構變得非常有效。

如果字典是排序的(為什么字典不是?),那么你可以在log(n)時間內查找單個單詞,並通過文件進行二進制搜索,不需要其他結構。

我認為在字典中找到單詞的最佳方法是B +樹。讓我解釋一下原因。

假設你有一個10個字符串的根塊。塊中的字符串是排序的。這10個字符串后跟一個指向另一個10個字符串的單元格的指針,然后就是一個。所以你唯一需要做的就是字符串比較你的關鍵詞從第一個開始,直到你發現一個比較小的字(StringCompare)。

如果我們將其作為標准,每個字符串旁邊都有一個指針,該指針向單元格顯示相對較小的單詞,則需要5步和5次比較才能結束最終的數據括號,這些數據可能會或可能會不包含您的關鍵字。

在5個比較+最后括號中的比較中,您正在搜索10 * 10 * 10 * 10 * 10個單詞的字典。

算法的對數速度為Log 100000,基數為單元格中的字符串數。如果每個單元格有10個單詞,則需要5個步驟。

我必須提到的是,只有樹的根必須存儲在Ram存儲器中。所有其他塊可以存儲在硬盤驅動器中而不會因為幾個步驟而在性能上沒有明顯損失。

希望我解釋正確:D至少我試過! 玩得開心

Trie是首選,因為此數據結構可能比散列表更快。 哈希表僅在理想情況下為O(1) ,在現實世界中應用程序可能發生沖突。 不同類型的trie數據結構不會受此影響。

另一種情況是壓縮。 Trie比哈希表更緊湊。 哈希表需要一些空間來進行有效的插入操作。 如果哈希表的加載因子為100%,則插入操作需要很長時間。

對於哈希表,您必須將您的密鑰與字典中的至少一個密鑰進行比較,在這種情況下密鑰比較需要O(k) ,其中密鑰長度為k。 使用trie,你正在做同樣的事情,你的查找操作是O(k)

嘗試允許有序遍歷,哈希表 - 不要。

有很多類型的嘗試,例如三元搜索特里在這種特殊情況下是好的。 與常規哈希表相比,數組映射的trie也非常快。

暫無
暫無

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

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