在Python中的二进制搜索算法中查找数组的中间索引值

Posted

技术标签:

【中文标题】在Python中的二进制搜索算法中查找数组的中间索引值【英文标题】:Finding the middle index value of an array in a binary search algorithm in Python 【发布时间】:2019-02-07 23:13:56 【问题描述】:

我是 Python 新手,正在实现二进制搜索算法。这是算法:

def binary_search(list, item):
    low = 0     
    high = len(list)-1

    while low <= high:
        mid = (low + high)
        guess = list[mid]

        if guess == item:
            return mid      
        if guess > item:
            high = mid - 1      
        else:
            low = mid + 1   
    return None

我的问题是关于mid = (low + high) 行。无论我使用mid = (low + high) 还是mid = (low + high)/2,该算法都会为数组中的任何项目返回正确的索引位置。这是为什么?我到处寻找这个特定问题的解释,但找不到。我所发现的只是 Python 3 会自动舍入不可整除的数字,因此对于具有奇数个元素的数组,例如 13,中间元素的索引将为 6。但是上面的算法如何得到每次都除以2而不是中间索引元素?

【问题讨论】:

在每一步打印出高、低和中,看看发生了什么。 【参考方案1】:

这是因为你的算法不是二分搜索。

mid = (low + high)

因为 high 开始于 len(arr) - 1 而 low 总是从 0 开始 mid 总是从 len(arr) - 1 开始。

if guess > item:
    high = mid - 1

在这种情况下,在下次重新计算 mid 时,mid 的值会减一。因此,如果猜测太高,它会下降一个元素。问题是因为mid 总是从len(arr) - 1 开始,所以它总是Trueguess 总是从最大的元素开始,然后一个接一个地下降。直到你击中:

if guess == item:
    return mid

在这种情况下,您只需退回商品。您的算法以一种逐一的方式从最后一个元素到第一个元素线性搜索项目。

如果你真的添加了print(low, high, mid),你会得到这样的输出:

0 6 6
0 5 5
0 4 4
0 3 3
0 2 2
0 1 1
0 0 0

【讨论】:

非常感谢您的回答!我应该改变什么使它成为二分搜索? mid = (high + low) / 2。不过,您可能需要解决一些错误,例如 high = mid - 1 应该是 high = mid。但是网上有很多二分查找的实现:geeksforgeeks.org/binary-search

以上是关于在Python中的二进制搜索算法中查找数组的中间索引值的主要内容,如果未能解决你的问题,请参考以下文章

python 二分法查找

二分查找

查找算法-二分查找

二分查找最优实现

二分查找算法

算法题解:二分查找算法(循环/递归)