words = {}
for key in programs.keys():
for w in key.split():
w = w.lower()
if w not in words:
words[w] = set()
words[w].add(key)
def lookup(search_string, words, programs):
result_keys = None
for w in search_string.split():
w = w.lower()
if w not in words:
return []
result_keys = words[w] if result_keys is None else result_keys.intersection(words[w])
return [programs[k] for k in result_keys]
您应该使用mensi给出的蛮力方法,直到证明它太慢为止。
这里有一些重复的数据,以提供一个更快的查找。只有当你只搜索整个单词时,它才起作用——也就是说,你永远不需要匹配“纽约最好的百吉饼”,因为“约克”和“约克”是不同的单词。
如果单词必须按顺序排列(即“York New”不应匹配),则可以将brute force方法应用于
result_keys
的短列表。这通常被称为松弛字典,它可以使用后缀树有效地实现。
这种方法使用的内存在键上是线性的,这是最优的,搜索时间在您正在搜索的子串长度上是线性的,这也是最优的。
我在python中找到了实现这个功能的库。
https://hkn.eecs.berkeley.edu/~dyoo/python/suffix_trees/
相关问题 更多 >
编程相关推荐