Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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_Binary Search - Fatal编程技术网

Python 我想做一个二进制搜索,但结果是错误的

Python 我想做一个二进制搜索,但结果是错误的,python,binary-search,Python,Binary Search,我想对一个列表进行二进制搜索,但结果显示“false”,即使我从列表中选择了一个数字 def clist(a): l = [2,6,5,9,7,1,4,8,3] newl = sorted(l) check = int(1+len(newl)/2) if newl[check] == a: return True if check > a: for x in newl[:check]: i

我想对一个列表进行二进制搜索,但结果显示“false”,即使我从列表中选择了一个数字

def clist(a):

    l = [2,6,5,9,7,1,4,8,3]
    newl = sorted(l)
    check = int(1+len(newl)/2)

    if newl[check] == a:
        return True

    if check > a:
        for x in newl[:check]:
            if x == a:
                return True
            return False

    if check < a:
        for x in newl[check::]:
            if x == a:
                return True
            return False

print(clist(7))
def clist(a):
l=[2,6,5,9,7,1,4,8,3]
newl=已排序(l)
检查=int(1+len(newl)/2)
如果newl[check]==a:
返回真值
如果选中>a:
对于新的x[:检查]:
如果x==a:
返回真值
返回错误
如果检查
请检查以下内容:

def clist(a):

    l = [2,6,5,9,7,1,4,8,3]
    newl = sorted(l)
    check = int(1+len(newl)/2)

    if newl[check] == a:
        return True

    if newl[check] > a:              #fixed the bug here
        for x in newl[:check]:
            if x == a:
                return True

    if newl[check] < a:             #fixed the bug here
        for x in newl[check:]:
            if x == a:
                return True

    return False        #Return false should be universal. When the entire search fails it should be called.

print(clist(7))

def clist(a):
l=[2,6,5,9,7,1,4,8,3]
newl=已排序(l)
检查=int(1+len(newl)/2)
如果newl[check]==a:
返回真值
如果newl[check]>a:#修复了此处的错误
对于新的x[:检查]:
如果x==a:
返回真值
如果newl[check]
您的函数不是二进制搜索,而是在检查中间元素之后,逐个检查已排序列表的元素

def binary_search(arr, i):
    n = len(arr)
    arr = sorted(arr)
    left = 0
    right = n - 1

    # Define the condition when the loop should be broken 
    while (left <= right):
        mid = left + (right-left) // 2
        if arr[mid] == i:
            return True
        elif arr[mid] < i:
            left = mid + 1 
        else:
            right = mid - 1
    return False

l = [2,6,5,9,7,1,4,8,3]
i = 7
binary_search(l, i)
def二进制搜索(arr,i):
n=长度(arr)
arr=已排序(arr)
左=0
右=n-1
#定义应在何时断开循环的条件

而(左您可以这样编写脚本:

  • 以列表中间的元素为例
  • 如果你需要的话,把它还给我
  • 如果
    指针
    大于中间位置,则调用列表剩余右侧的
    b搜索
  • othwewise调用
    b用左侧搜索
  • def b搜索(针、草堆):
    l=len(干草堆)
    一半=整数(l/2)
    元素=干草堆[一半];
    如果元素==指针:
    返回元素
    如果针元件:
    返回b搜索(针、草堆[一半:l])
    打印(b搜索(7、[1、2、3、4、5、6、7、8、9、10]))
    

    在二进制搜索中:

  • 必须对列表进行排序
  • 正如@tripleee所述,您必须递归地将列表一分为二

  • 无论如何,这不是二进制搜索。您将列表拆分一次,然后恢复为线性搜索。正确的二进制搜索将继续将列表拆分为两半,直到只剩下一个元素。但是,如果您将列表作为例程的一部分进行排序,您将遍历所有列表。二进制搜索只有在您已经知道输入是正确的情况下才有意义排序。这个答案对OP有什么帮助?看起来你试图做的是问一个问题或做一个评论(“你能看看这个代码在做什么吗?”或“请描述一下代码做什么以及为什么。”)。添加了注释。希望有帮助。1.可能应该放在注释中。2.可能是OP是二进制搜索的学习阶段。这就是为什么我没有给出明确的答案。我刚刚修复了错误。幸运的是,您拥有的不是二进制搜索。:-(您是对的,OP可能正在学习它(事实上,这很有可能是真的),但演示代码就是给出一个明确的答案,因此添加关于您所做的事情的文字并不会改变这一点。它只是让答案更具可读性(这是一件好事)。:-)如果您的脚本与第一个if语句不匹配,它就不再是对数的。此代码不适用于指针不在草堆中的情况。请尝试
    b搜索(1[0,2,3])
    (它给出了一个
    递归错误
    )和b搜索(0[1,2,3])``(它给出了一个
    索引器
    )。看起来OP想要返回
    True
    ,如果项目在列表中,则返回
    False
    。但更重要的是,OP想要知道他们的代码有什么问题。这里的答案似乎都不能解决这个问题。嗨,我的只是一个关于如何编写
    b search
    的快速提示,它无法处理任何问题edge case(我认为很容易添加)。返回
    True/False
    也很容易。我的回答的全部范围是显示算法本身背后的逻辑(递归调用bsearch,使用一半初始输入)这就是op的代码的问题所在。我看到了所有的答案和评论,从中我学到了一些东西。我是一个编码新手。现在,我明白了什么是二进制搜索。谢谢。