Python 二进制搜索总是返回目标未找到的值

标签 python search binary-search

我编写了以下代码来对列表或元组 collection 中的值 target 进行二进制搜索。

def binary(collection, target):
    """Binary search
    Takes a sorted list or tuple, collection, then searches for target
    Returns -1 if item isn't found. """
    length = len(collection)
    minimum = 0
    maximum = length - 1
    while minimum <= maximum:
        pivot = (minimum + maximum) // 2
        if collection[pivot] is target:
            return pivot
        elif collection[pivot] > target:
            minimum = pivot + 1
        else:
            maximum = pivot - 1
    return -1

如您所见,当在 collection 中找不到 target 时,函数返回 -1。无论我做了什么,该函数都返回了 -1。

>>> test = [1, 2, 3, 4, 5, 6]
>>> binary(test, 5)
-1
>>> binary(test, 1)
-1

是什么导致了这个问题?

最佳答案

你有这个条件倒退:

elif collection[pivot] > target:

切换它,搜索工作:

elif collection[pivot] < target:

对于它的值(value),我通过在您的搜索中添加打印输出以查看发生了什么来解决这个问题。如有疑问,请添加打印输出:

>>> binary([1, 2, 3], 1)
(min=0, max=2, pivot=1)
(min=2, max=2, pivot=2)
     ^ Oops

# After fixing...
>>> binary([1, 2, 3], 1)
(min=0, max=2, pivot=1)
(min=0, max=0, pivot=0)

顺便说一下,内置的bisect module执行二进制搜索。您不必自己编写,除非您这样做是为了教育值(value)。

关于Python 二进制搜索总是返回目标未找到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689891/

相关文章:

jquery - 如何通过 API 查询搜索 Instagram?

c - 在 C 中使用 printf 格式化二进制搜索的输出?

python - 在二进制搜索中,为什么 mid = (left + (right - left))//2 比 mid = (left + right)//2 好?

python - 如何对相同值的范围进行二分查找?

c++ - 我如何有效地在元素之前和之后搜索关键短语

python - 您可以将文件内容转换为文件对象吗?

python - 将列标签的级别附加到 MultiIndex

python - 是否可以使用 scikit-learn 构建 id3 决策树?

python - networkx代码python的解释

search - 为 Microsoft Graph 创建一个等效于 "contains"的筛选器查询