减少所有英语单词的Trie大小

时间:2019-06-17 08:55:05

标签: python trie

我正在使用Trie实现自动完成功能。使用this链接中的单词列表,我将每个单词插入到Trie中。我想减少Trie占用的内存,而又不使用像有向非循环字图这样过于花哨的东西。

Trie是基于字典的,允许将其存储在JSON文件中。这是我当前的脚本:

import json 

#Make a trie of english words
# The words file can be found at https://github.com/dwyl/english-words
with open('words_dictionary.json', 'r') as file:
    words = json.load(file)

_end = '_end_'
trie = {}

def make_trie(words):
    root = trie 
    for word in words:
        current = root
        for char in word:
            if char not in current:
                current[char] = {}
            current = current[char]
        current[_end] = _end 

make_trie(words)

with open('word_trie.json', 'w') as outfile:
    json.dump(trie, outfile)

如果可以做到这一点,请帮助我提供代码段。

1 个答案:

答案 0 :(得分:1)

如果trie是静态的,这意味着您不需要时不时地在其中插入单词,而是可以“一次全部”构建它,那么您需要的结构是DAFSA,代表有向无环有限状态自动机。如果您的特里是动态的,这意味着您将需要在其中插入新单词,DAFSA仍然是答案,但是算法要困难得多。

这基本上是trie的压缩版本,具有相同的访问速度,但在一般情况下所需的空间要低得多。

将特里转换成DAFSA的算法(有时称为有向无环字图的DAWG)不像简单地构建特里的算法那样简单,但是它们是可以理解的。您应该找到所需的一切here