Python跳转搜索算法不返回一个数字

时间:2018-02-20 07:44:08

标签: python algorithm search

我正在尝试实现跳转搜索算法。但是,在下面的这个例子中,我找不到72的数量,即使它明显在我定义的列表中。这是代码,有人可以向我解释为什么可以返回其余的数字,而不是列表中位置索引0的72?

def jumpSearch(list, number, constant) :
    i = 0
    counter = 0
    while (list[i] < number and i + constant < len(list) and list[i + constant] < number) :
        i = i + constant

    for j in range (i, i + constant, 1) :
        if (list[j] == number) :
            return list[j]
    return None

mylist = [72, 56, 93, 8, 22, 41, 88, 23, 60]
mylist.sort()
print(jumpSearch(mylist, 72, 3))

我在网上看到了其他的例子,但是,我真的想测试自己从头开始编写代码和逻辑的能力,以便得到结果。

因此,我对跳转搜索的基本理解使我无法知道这是否是进行跳转搜索的“正确”方式。对代码进行任何评估或改进,甚至是编写跳转搜索的“最佳和正确”方式的样本对我的学习都很有价值!

3 个答案:

答案 0 :(得分:1)

如果查看while循环,您会看到当list[i + constant]不再小于72时会发生什么:

while (... list[i + constant] < number):

list[i + constant]较小时递增,而不是在相等或更大时递增。

因此,我们知道该值介于list[i]list[i + constant] 包含之间。但是,range()会产生数字 exclusive 结束值。来自range() documentation

  

对于肯定的步骤,范围r的内容由公式r[i] = start + step*i确定,其中i >= 0 r[i] < stop

(大胆强调我的)。

所以你有一个错误的错误。 range()生成的最后一个值为i + constant - 1,而72代替i + constant

您需要在结束值中添加一个并搜索range(i, i + constant + 1)

for j in range (i, i + constant + 1):

答案 1 :(得分:0)

我在你的功能中添加了一些调试输出,以便你可以看到发生了什么:

def jumpSearch(mylist, number, constant):
    i = 0
    counter = 0

    while (mylist[i] < number 
          and i + constant < len(mylist)
          and mylist[i + constant] < number):

        format_str= "In while:\n\t mylist[{}]={},number={},i+constant={},len(mylist)={},mylist[i+constant]={}"

        print( 
            format_str.format(
                i,
                mylist[i], 
                number,
                constant,
                len(mylist),
                mylist[i+constant]
            )
        )


        i = i + constant
        print("\t i={},mylist[{}+3]={},number={}".format(i,i,mylist[i+3],number))


    for j in range (i, i + constant, 1):

        f_string =  "In for:\n\t j={},i={},i+constant={},mylist[{}]={},number={}"
        print( f_string.format(j, i, i+constant, j, mylist[j], number))

        if (mylist[j] == number) :
            return mylist[j]

    return None

mylist = [72, 56, 93, 8, 22, 41, 88, 23, 60]
mylist.sort() #=> [8, 22, 23, 41, 56, 60, 72, 88, 93]
print(jumpSearch(mylist, 72, 3))

--output:--
In while:
     mylist[0]=8,number=72,i+constant=3,len(mylist)=9,mylist[i+constant]=41
     i=3,mylist[3+3]=72,number=72
In for:
     j=3,i=3,i+constant=6,mylist[3]=41,number=72
In for:
     j=4,i=3,i+constant=6,mylist[4]=56,number=72
In for:
     j=5,i=3,i+constant=6,mylist[5]=60,number=72
None

你可以看到while循环只执行一次。 while循环的第二行输出显示mylist[3+3]等于number,而while循环的下一次迭代测试mylist[6] < number是否为false。因此,执行跳转到for循环,输出显示for循环永远不会找到等于72的mylist[j]

答案 2 :(得分:0)

其中一个步骤的索引72 完全(在您的情况下为6,步骤为3),您错过了它,因为您使用<代替{ {1}}签名。

<=更改为list[i + constant] < number