Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python二进制搜索始终返回未找到的目标值_Python_Search_Binary Search - Fatal编程技术网

Python二进制搜索始终返回未找到的目标值

Python二进制搜索始终返回未找到的目标值,python,search,binary-search,Python,Search,Binary Search,我编写了以下代码,以在列表或元组集合中对值进行二进制搜索,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 m

我编写了以下代码,以在列表或元组集合中对值进行二进制搜索,
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

是什么原因导致此问题?

您的情况如下:

elif collection[pivot] > target:
切换它,搜索就会工作:

elif collection[pivot] < target:

顺便说一下,内置的执行二进制搜索。你不必自己写,除非你是为了教育价值而写。

你有这样的条件:

elif collection[pivot] > target:
切换它,搜索就会工作:

elif collection[pivot] < target:

顺便说一下,内置的执行二进制搜索。你不必自己写,除非你是为了教育价值而写。

除了将你的条件测试改为
elif collection[pivot]
,你还使用了“is”操作符来测试你是否找到了目标项:

    if collection[pivot] is target:
您应该使用“==”:

使用“is”测试两个对象是否实际上是同一个对象。在Python中,小字符串和整数对象常常被存储和回收,所以这可能是可行的。然而,在大多数情况下,它不会:

>>> a='abc'
>>> id(a)
2129839392
>>> b='ab'
>>> b+='c'
>>> id(b)
2129963136
>>> a
'abc'
>>> b
'abc'
>>> binary([a],a)
0
>>> binary([a],b)
-1

除了将您的条件测试更正为
elif collection[pivot]
,您还使用“is”操作符测试是否找到了目标项:

    if collection[pivot] is target:
您应该使用“==”:

使用“is”测试两个对象是否实际上是同一个对象。在Python中,小字符串和整数对象常常被存储和回收,所以这可能是可行的。然而,在大多数情况下,它不会:

>>> a='abc'
>>> id(a)
2129839392
>>> b='ab'
>>> b+='c'
>>> id(b)
2129963136
>>> a
'abc'
>>> b
'abc'
>>> binary([a],a)
0
>>> binary([a],b)
-1

纯粹的教育价值。我是根据我记忆中的二进制搜索来完成的。我查看了对分模块,似乎
bisect\u left()
可以作为二进制搜索使用,只需稍加修改。谢谢你的提示。上次我尝试编写自己的二进制搜索时,我花了大约10次迭代才让这个愚蠢的东西工作起来。一个接一个的错误是我的氪石。:-)当我们讨论二进制搜索时,如果找不到值,是否最好引发ValueError而不是返回-1?我觉得如果有人使用了它,但没有读取源代码或docstring,他们会将其输入到列表索引中,并在找不到值时获取索引(因为-1是有效的索引),即使Python库也无法决定:
str.find
返回-1,
str.index
引发ValueError。虽然
列表
只有
索引
,但这可能会打破这种联系。纯粹的教育价值。我是根据我记忆中的二进制搜索来完成的。我查看了对分模块,似乎
bisect\u left()
可以作为二进制搜索使用,只需稍加修改。谢谢你的提示。上次我尝试编写自己的二进制搜索时,我花了大约10次迭代才让这个愚蠢的东西工作起来。一个接一个的错误是我的氪石。:-)当我们讨论二进制搜索时,如果找不到值,是否最好引发ValueError而不是返回-1?我觉得如果有人使用了它,但没有读取源代码或docstring,他们会将其输入到列表索引中,并在找不到值时获取索引(因为-1是有效的索引),即使Python库也无法决定:
str.find
返回-1,
str.index
引发ValueError。虽然
列表
只有
索引
,所以这可能打破了这种联系。虽然二进制搜索的基本思想相对简单,细节可能会出人意料地棘手-Donald Knuth教授。是否有Donald Knuth没有引用的主题?虽然二进制搜索的基本思想相对简单,但细节可能出人意料地棘手-Donald Knuth教授。是否有Donald Knuth没有引用的主题?