确实,这tries
使得回答这些查询变得非常快速和高效。有点不清楚你是总是从词尾搜索还是从头开始搜索,但如果两者兼而有之,那么你将不得不为两个方向构建尝试。如果您需要在中间找到匹配项,那么这两种尝试都无济于事。
反向索引(例如那些为搜索引擎提供支持的索引)有时会通过将单词存储为字符n-gram来解决此问题,然后存储 n-gram 之间的连接信息以构造单词。例如,“溢出”可能被分解为“ove”、“rfl”和“ow”,并且在某处存在一些元数据,指出存在一个组合这三个 n-gram 的单词。以不同的方式分解每个单词可以实现前导和尾随通配符查询,尽管我对细节很模糊:-/
或者考虑这样一个事实,除非性能对这个应用程序非常关键,否则对于这种字典大小,使用正则表达式可能足够快(并且可能会进一步优化),并且非常简单。使用 80k 词词典的快速测试:
with open('dictionary.txt') as fin:
words = fin.read().strip().split('\n')
import re
import time
expr = re.compile(r'a[^aeiouy]+e$', re.I)
# Of course, this extends easily to using a dictionary, too
def bench():
start = -time.time()
matches = [word for word in words if expr.search(word)]
return start + time.time()
在我的计算机上大约需要 50 毫秒,并且为了使用正则表达式的简单性和清晰性以及您有限的时间,我认为这是值得的。