我正在尝试实现跳转搜索算法。但是,在下面的这个例子中,我找不到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))
我在网上看到了其他的例子,但是,我真的想测试自己从头开始编写代码和逻辑的能力,以便得到结果。
因此,我对跳转搜索的基本理解使我无法知道这是否是进行跳转搜索的“正确”方式。对代码进行任何评估或改进,甚至是编写跳转搜索的“最佳和正确”方式的样本对我的学习都很有价值!
答案 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
。