所以我试图编写一个迭代二进制搜索,它不会将值与半中间索引进行比较,直到(lower_bound - upper_bound)&lt; = 1.尝试减少项目的比较。我想只比较下面和上面的差值是否<= 1。
下面的代码循环遍历所有first_list项,并将其与second_list进行比较,如果在second_list中找到first_list项,则追加到list_found。但是list_found的输出似乎不正确。例如,如果我在first_list中的second_list中添加一个值,它不会显示在list_found中。
同样list_found似乎总是只打印出一个值,即使first_list和second_list中有多个相同的项目。
first_list = [1,2,3 ..... values]
second_list = [values.....]
list_found = []
comparisons = 0
for i in first_list:
upper_bound = len(second_genome) - 1
lower_bound = 0
stop = False
while stop is False:
middle = (lower_bound + upper_bound) // 2
comparisons += 1
if second_list[middle] <= i:
lower_bound = middle
else:
upper_bound = middle
if lower_bound - upper_bound <= 1:
comparisons += 1
if middle == 0:
if second_list[middle + 1] == i:
list_found.append(i)
stop = True
if second_list[middle] == i:
list_found.append(i)
stop = True
答案 0 :(得分:1)
为什么不简单地使用套装? 计算集合上的交叉点应该比列表更有效,因为不需要循环。
如果您的输入是:
first_list = [1,3,5,7,9]
second_list = [0,3,6,9]
您的输出可以是:
found_set = set(first_list).intersection(set(second_list))
print(found_set)
output: set([9, 3])
然后你可以像使用found_list那样迭代你的found_set。
PS:请注意,set元素是唯一的,因此first_list中的重复元素只会在found_set中出现一次
答案 1 :(得分:0)
错字:
upper_bound = len(second_genome) - 1
我认为这应该是:upper_bound = len(second_list) - 1
问题:尝试减少与项目的比较
我没有看到这样做的好处
您的代码使用 6比较,默认二进制搜索使用 4 Comparsions 。
重新思考你的方法!
问题:... list_found似乎总是只打印出一个值 如果我在first_list中的second_list中添加一个值,它不会显示在list_found
中
这是因为您的middle
没有迭代:
数据:
first_list = [1, 2, 3, 4, 5, 6] second_list = [3,4,5]
<强>输出强>:
second_list[1](4) == 1 l/u:-1 second_list[1](4) == 2 l/u:-1 second_list[1](4) == 3 l/u:-1 second_list[1](4) == 4 l/u:-1 second_list[1](4) == 5 l/u:-1 second_list[1](4) == 6 l/u:-1 list_found:[4]