二进制搜索不检查中间值

时间:2017-08-19 11:12:15

标签: python

所以我试图编写一个迭代二进制搜索,它不会将值与半中间索引进行比较,直到(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

2 个答案:

答案 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]