我有两个要比较的单词列表。第一个列表是200万字,第二个列表是15万字。我需要做的是应用二进制搜索来查看第一个列表中的单词是否出现在第二个列表中。我正在尝试班轮搜索:
for word in words_list:
if word in dict_list:
print(word, 1)
else:
print(word, 0)
效果很好,但速度很慢。 然后我尝试了二进制搜索,但它无法正常工作:
for word in wordlist:
lb = 0
ub = len(dict_list)
mid_index = (lb + ub) // 2
item_at_mid = dict_list[mid_index]
if item_at_mid == word:
print(word)
if item_at_mid < word:
lb = mid_index + 1
else:
ub = mid_index
最后,我需要两个列表第一个字典列表,其中第二个不是。
答案 0 :(得分:2)
您可以使用套装:
ename,enum
答案 1 :(得分:1)
如果您使用二进制搜索,则应该已经订购了输入。
另一种可能性是将您的words_list
和dict_list
转换为set
并获得如下输出:
两者共同的词语:
words_list.intersection(dict_list)
不是另一个词:
words_list-dict_list
dict_list-words_list
答案 2 :(得分:1)
如果你想进行二元搜索:
present = []
absent = []
for word in firstList:
lb,ub = 0,len(secondList) - 1
found = False
while lb <= ub:
mid = (lb + ub) // 2
if secondList[mid] == word:
found = True
break
elif secondList[mid] < word:
lb = mid + 1
else:
ub = mid - 1
if found:
present.append(word)
else:
absent.append(word)
您的二进制搜索代码不正确。
答案 3 :(得分:0)
解决方案是首选使用set
而不是列表,因为O(1)
操作的__contains__
复杂度,如this solution中所述。
如果内存有问题,那么使用bloom filter可能是一个很好的权衡(没有假阴性)。
Here is a python implementation
要创建和维护二叉树,请考虑使用heapq
标准模块。