我按照这些说明创建了一个基本的斐波那契搜索程序:
让F
为斐波那契(ListFibonacci
)数字列表,直至排序列表n
的长度ListElements
。 (如果n
不是斐波纳契数,则F
包含直到下一个大于n
的斐波那契元素的元素。让X
为我们需要在排序列表ListElements
中找到其位置的数字。
要测试X
中是否ListElements
,请按以下步骤操作:
1)让k = F[p-1]
位于p = len(F)
(即F
的最后一个元素)
2)如果k = 0
,请停止。没有比赛; X
不在ListElements
列表中。{/ 1>
3)将X
与ListElements
处F[p−2]
处的元素进行比较。
4)如果X
匹配,请停止。
5)如果X
小于ListElements
条目F[p−2]
中的条目,则元素X
必须位于1
的下半部分F[p-2]
中的ListElements
。设置p = p − 1
,k = F[p-1]
并返回第2步。
6)如果项目大于条目F[p-2]
,则元素X
必须位于F[p-2]
中从n
到ListElements
的上半部分。 将ListElements
的搜索起始地址更新为F[p-2]
。 设置p = p − 2
,k = F[p-1]
并返回步骤2。
大胆的部分是我相信我遇到的问题最多,但总的来说,我对6)的理解相当低。为了澄清理解,指令和编写程序是作业的一部分。
这是我目前的计划:
F = [0,1,1,2,3,5,8]
ListElements = sorted([83,24,65,123,175,57,123,243])
X = 243
p = len(F)
k = F[p-1]
if(k == 0):
print("K = 0")
else:
while(True):
print("test1")
if(X == ListElements[F[p-2]]):
print(str(X) + " " + str(p) + " " + str(k))
break
elif(X < ListElements[F[p-2]]):
print("test2")
p -= 1
k = F[p-1]
elif(X > ListElements[F[p-2]]):
print("test3")
p -= 2
k = F[p-1]
以下是一些输出:
Input: X = 123,
Output: test1
123 7 8
Input: X = 243,
Output: test1
File "C:\SNIP", line 20, in <module>
if(X == ListElements[F[p-2]]):
IndexError: list index out of range
Traceback (most recent call last):
test3
test1
test3
test1
test3
test1
Input: 24,
Output: test1
test2
test1
test2
test1
test2
test1
test2
test1
test2
test1
24 2 1
答案 0 :(得分:0)
我认为你的教授或任何设置任务的人都笑了,这个算法甚至不接近Fibonacci序列的基本算法。首先是你的观点3
3)将X与指数F [p-2]的ListElements中的元素进行比较。
要求您使用斐波纳契数列表中的一个数字作为索引,它应该是
3)将X与索引为p-2的ListElements中的元素进行比较。
然而,这将要求两个列表具有相同的长度,并且就您所示,没有先决条件。
斐波那契搜索的真实算法可以在维基百科页面上找到:https://en.wikipedia.org/wiki/Fibonacci_search_technique