[英]Get words from trie containing specific letters
我想從包含特定字母的 trie 中檢索單詞。 例如:列出所有包含字母 [a, g] 的單詞。 如果我的 trie 有 ["APPLE", "EGG", "CAR", "BLUE", "AGRICULTURE", "DONE"] 的話,它會返回 "AGRICULTURE"。
這是一個非常簡單的 trie 實現
def load_trie(words):
root = {}
for word in words:
curr_node = root
for letter in word:
curr_node = curr_node.setdefault(letter, {})
curr_node.setdefault('', True)
return root
with open('sowpods') as word_list:
words = [word.strip().upper() for word in word_list]
TRIE = load_trie(words)
如果我可以檢查包含特定字母的單詞,那么查找不包含特定字母的單詞也會很好。
@Mark 提供了關於雙重問題的有用評論:
對於不包含字母的單詞,您可以使用這些鍵修剪分支。
現在,我們怎樣才能使樹或任何樹很好地適應原始問題? 讓我們來看看。 字謎問題的標准答案是存儲排序的字母集
for word in vocabulary:
set_to_word[sorted(word)].append(word)
接着
set_to_word.get(sorted(target_word))
將顯示所有相應的字謎。
為了使其適應 trie,我們希望在根附近出現頻繁的字母。 這是字母表的一種合理頻率排序:
ETAOINSRHLDCUMFPGWYBV KXJQZ
而不是sorted( ... )
排列,而是按 etaoin 排列單詞,並利用命中通常會導致在根附近命中的事實。 在這個方案中,“眼淚”將映射到“etasr”。
對於對偶問題,只需存儲字母的補集,遵循相同的順序。 所以“眼淚”映射到一個 21 個字符的字符串,或者一些前綴截斷就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.