如何在Python中使用二进制搜索查找多个值

时间:2018-06-05 00:42:46

标签: python binary-search

我使用标准二进制搜索算法,该算法将整数值作为参数,并在列表中搜索整数。但是,我希望能够在列表中找到与搜索值匹配的每个整数的位置索引。到目前为止我所拥有的是:

def bin_search(x):
    my_list = [57,68,76,77,82,86,89,89,89,98,100]
    bottom = 0
    top = len(my_list)-1
    found = False
    location = -1
    while(bottom <= top) and not(found):
        middle = int((bottom + top)//2)
        if(my_list[middle] == x):
            location = middle
            found = True
        else:
            if x < my_list[middle]:
                top = middle - 1
            else:
                bottom = middle + 1

    return location

print(bin_search(89))

任何有助于使此二进制搜索能够找到两个值的帮助都将受到赞赏!

3 个答案:

答案 0 :(得分:0)

在二进制搜索结束时添加此代码将为用户提供正在搜索的值的第一个和最后一个匹配项的索引(在本例中为x)。然后,用户可以使用索引查找与搜索项匹配的索引范围,因为他们知道搜索项的第一次和最后一次出现的索引。

# Index of last occurrence
location2 = -1
# Index of first occurrence
location3 = -1

# Finds last index that matches x
for I in range(len(my_list)):
    if my_list[I] == x:
        location2 = I
# Finds first index that matches x
for I in range(len(my_list)):
    if my_list[I] == x:
        location3 = I
        break

答案 1 :(得分:0)

想到的是两次执行二进制搜索:一次在列表上以排序顺序进行,另一次在列表上以相反顺序进行排序。

然后,知道列表的长度,就可以获取要查找的元素的第一个和最后一个索引。

来自此article

  

二进制搜索的一个缺点是,如果数组中出现多次元素,则它不返回第一个元素的索引,而是返回最靠近中间元素的索引

您可以做的是remove duplicates from the list and remember the index,然后执行二进制搜索。

答案 2 :(得分:0)

这可以在python中轻松完成, 通过检查要定位的第一个匹配项并从列表中删除匹配的值。 并继续搜索...

print("Binary Search!")
my_arr =[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10]
my_arr.append(4)
print(my_arr)
target = 4
low = 0
high = len(my_arr)-1
while(low<=high):
    mid = (low+high)//2
    if my_arr[mid]==target:
        print("found target",my_arr[mid],mid)
        my_arr.remove(my_arr[mid])
    elif my_arr[mid]>target:
        high =mid-1
    else:
        low = mid +1