我在Python中的二进制搜索功能无法正常工作

时间:2019-03-28 05:53:21

标签: python arrays

我正在用Python开发二进制搜索功能。它不起作用,显示为空。

我试图用Pseudocode设置逻辑,我的老师说它可以工作,但是他们不知道为什么算法和函数正在做他们正在做的事情。我已经使伪代码上的油脂变得稀疏,并且多个人已经能够解决我的问题。

def binary_search(array,item):
    start_point = 0
    end_point = len(array)
    mid_point = int((start_point + end_point) / 2)
    array.sort()
    print(array)it
    while array[mid_point] != item:
        if array[mid_point] > item:
            start_point = mid_point
        elif array[mid_point] < item:
            end_point = mid_point
    if array[mid_point] == item:
        print(mid_point)

binary_search([0,99,2,6,4,8],7)

我希望此函数起作用,以便当您输入数组和搜索词时它会显示数组中的位置(索引值)

4 个答案:

答案 0 :(得分:2)

您实际上并没有对start_pointend_point做任何事情。

此外,如果中间的元素大于您要查找的元素,您是否不想将end_point移动到中间? Elif语句也有同样的问题-如果中间的元素小于要查找的元素,则需要将start_point移到中间。

答案 1 :(得分:1)

使用此伪代码,您做得很好,但是,它并不完整。请考虑以下几点:

  • 如果while变成mid_point,则需要在zero循环中添加一个条件才能停止。
  • 您还需要在mid_point条件的每个分支处更新if的值。
  • 您需要从1的第一个赋值中减去mid_point,因为 python 零索引语言。

这是该代码的有效版本:

def binary_search(array,item):
    start_point = 0
    end_point = len(array)
    mid_point = int((start_point + end_point) / 2)-1
    array.sort()
    print('array after sorting:',array)

    while mid_point < len(array) and mid_point > 0:
        if array[mid_point] == item:
            print('item found at cell:',mid_point,', Note that array index starts from zero!')
            return
        elif array[mid_point]>item:
            end_point = mid_point
            mid_point = int((start_point + end_point) / 2)
        else:
            start_point = mid_point
            mid_point = int((start_point + end_point) / 2)
    print('number not found!')
    return


binary_search([0,99,2,6,4,8,12,13,17,15],8)

答案 2 :(得分:1)

首先,在解决问题之前,我们先讨论二进制搜索,

二进制搜索:通过将搜索间隔重复分成两半来搜索排序的数组。从覆盖整个数组的间隔开始。如果搜索键的值小于间隔中间的项目,请将间隔缩小到下半部分。否则将其缩小到上半部分。

在这里,每次while循环完成它的单循环时,您都需要更改中点,然后您需要检查项目是在下半部还是在上半部(如果它存在于下半部),那么您需要更改端点而不开始点,如果在上半部分,则更改下点

还有一件重要的事情,在您的while条件中,如果没有元素,则它将处于无限循环中,因此您的while循环条件必须为while(end_point> start_point),因为我们正在每个循环中更改点。

参考代码:

def binary_search(array,item):
    start_point = 0
    end_point = len(array)
    array.sort()
    print(array)
    while end_point > start_point:
        mid_point = int((start_point + end_point) / 2)
        if array[mid_point] < item:
            start_point = mid_point+1
        elif array[mid_point] > item:
            end_point = mid_point-1
        elif array[mid_point] == item:
            print(mid_point)
            return
    print("ELement is not present")

binary_search([0,99,2,6,7,8],3)

答案 3 :(得分:0)

出问题的是,while循环在每次迭代时都比较array[mid_point]的相同值,因此如果条件满足,就会陷入无限循环。

二进制搜索是一种递归方法,每次迭代都会迭代同一列表中较小的元素,直到获得所需元素的索引(如果它存在于列表中)。 如果您对array进行切片并递归调用binary_search,则将新列表作为参数传递,则您的代码将起作用。然后可以用简单的while条件替换if循环。

有关更多参考,请检查this link并与您的函数进行比较以了解不同之处。 :)