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

Python 如何实现二进制搜索?

Python 如何实现二进制搜索?,python,algorithm,python-3.x,sorting,binary-search,Python,Algorithm,Python 3.x,Sorting,Binary Search,我正在尝试创建一个二进制搜索函数,我已经用下面的代码尝试过了,但我是python的初学者;我在I==alist[I]行中得到错误“列表索引必须是整数,而不是str”。你能帮我解决这个问题吗?以下是全部代码: def bsort(alist, i): left = 0 right = len(alist)-1 i == alist[i] [mid] = (left + right)//2 if alist[mid] < i : le

我正在尝试创建一个二进制搜索函数,我已经用下面的代码尝试过了,但我是python的初学者;我在
I==alist[I]
行中得到错误“列表索引必须是整数,而不是str”。你能帮我解决这个问题吗?以下是全部代码:

def bsort(alist, i):
    left = 0
    right = len(alist)-1
    i == alist[i]

    [mid] = (left + right)//2

    if alist[mid] < i :
        left = [mid] + 1

    elif alis[mid] > i :
        right = [mid] + 1

    elif alist[mid] == i :
        print ("word found at", i )

    elif left > right:
        print ("Not Found!")       


i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
bsort(alist, i)
def bsort(列表,i):
左=0
右=len(alist)-1
i==alist[i]
[mid]=(左+右)//2
如果alist[mid]i:
右=[mid]+1
elif alist[mid]==i:
打印(“在”,i中找到单词)
elif左>右:
打印(“未找到!”)
i=输入(“输入搜索>”)
alist=[“老鼠”、“猫”、“蝙蝠”、“坐”、“吐”]
b排序(列表,i)

首先是检查相等性而不赋值的
=
。使用single=而不是
=
进行分配

此外,您的方法将i作为字符串,然后使用字符串引用列表的索引。这就产生了错误

您正在使用二进制搜索的整数方法来查找不正确的字符串。特别是因为字符串既不按长度排序,也不按字母顺序排序。请参阅其他一些方法来执行此操作


请参见“列表索引必须是整数,而不是str”,因为您将字符串作为列表中二进制搜索的输入,并在第4行中使用它作为列表的索引,这会导致错误,因为列表是通过整数索引的

另一个问题: 1.在应用二进制搜索之前,必须对列表进行排序, 2.6行导致另一个错误,因为int对象不可编辑。 3.为了在列表中进行完整的搜索,你必须包含一个while循环,它可以感知你的前两个if条件,并有助于在列表中循环

此代码可能会帮助您:

def bsort(列表、blist、i):

left=0
右=len(alist)-1
中间=(左+右)//2
离开时,我:
右=中+1
elif alist[mid]==i:
print(“word found at”,blist.index(i))#将在排序之前打印元素的原始索引
退出()#通过无限循环停止
elif左>右:
打印(“未找到!”)
i=输入(“输入搜索>”)#要搜索的字符串 alist=[“老鼠”、“猫”、“蝙蝠”、“坐”、“吐”] blist=alist[:]#创建另一个列表以了解原始列表中的元素索引 alist.sort()#用于执行二进制搜索的排序列表
b排序(alist,blist,i)

因此,从您的问题的声音来看,您正在尝试对您的示例进行二进制搜索。首先,了解二进制搜索只在排序数据上可靠地工作是很有用的。这与标准的线性搜索完全不同,无论顺序如何,线性搜索都会找到值。正如您可能已经知道的,二进制搜索是首选的,因为它在每次迭代中消除了一半的潜在候选元素,而线性搜索只消除了一个元素。话虽如此,让我们讨论一下我对您的程序所做的修改。首先,一些表面上的改变可以大大提高程序的清晰度

1.)使用描述性变量名非常重要,可以作为阅读代码的其他人的注意事项,了解变量的内容和功能。这在python这样的语言中尤其重要,因为在这种语言中,仅仅通过读取代码很难推断变量类型。因此,我没有多次重复使用变量
i
,而是重命名了函数参数
target
,因为这是我们试图定位的搜索词,即我们的“target”。我还将您的函数从“bsort”重命名为“bsearch”,这意味着该函数对某些内容进行排序,而“bsearch”是一个更合适的名称,因为它更准确地描述了该函数的功能

2.)二进制搜索可以使用循环或递归实现。为了简单起见,我选择了使用循环的迭代路线。正如我前面提到的,二进制搜索的工作原理是每次迭代消除一半的潜在搜索候选。如果没有循环,你确实会淘汰一半的候选人(只有一次),但除非你非常幸运,否则你很可能找不到你正在搜索的术语!相反,您需要继续此过程,直到找到要搜索的术语。这是
的函数,如果为True:
循环

3.)最后,我们确保使用整数访问列表的索引。python中的所有列表都从
0索引到n-1
,其中
n
是列表中的元素数。我们无法使用浮点值(如2.5)访问列表,因为这与列表中的任何特定“插槽”都不对应。类似地,我们不能使用字符串访问元素,因为列表同样需要整数来执行查找。这就是mid=int((左+右)/2)的目的

说了这么多,这应该能达到你的预期目的。我希望这对你有帮助!我还鼓励您查看一些如何实现二进制搜索的示例,例如

def b搜索(列表,目标):
左=0
右=len(alist)-1
尽管如此:
中间=整数((左+右)/2)
如果[mid]<目标:
左=中+1
elif列表[mid]>目标:
右=中+1
elif列表[mid]==目标:
打印(“+str(mid)”处的“word”+“target+”)
打破
elif左>右:
打印(“未找到!”)
打破
i=输入(“输入搜索>”)
alist=[“老鼠”、“猫”、“蝙蝠”、“坐”、“吐”]
表1.sort()
B研究(一)

地址是什么意思?输入是什么
i
是一个索引,必须是整数。还要注意的是,对分搜索对无序序列没有多大帮助。我怎样才能让它工作呢?这取决于…你的用例是什么?你在努力吗
left = 0
right = len(alist)-1

mid = (left + right)//2

while left <= right:    #  loop through the list
    if alist[mid] < i :
        left = mid + 1
    elif alist[mid] > i :
        right = mid + 1
    elif alist[mid] == i :
        print ("word found at", blist.index(i) )    # will print the original index of element i.e. before sorting
        exit()     #to stop through infinite looping
    elif left > right:
        print ("Not Found!")       
def bsearch(alist, target):
    left = 0
    right = len(alist)-1

    while True:
        mid = int((left + right)/2)
        if alist[mid] < target :
            left = mid + 1
        elif alist[mid] > target :
            right = mid + 1
        elif alist[mid] == target :
            print ("word '" + target + "' found at " + str(mid))
            break
        elif left > right:
            print ("Not Found!")
            break       


i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
alist.sort()
bsearch(alist, i)