想问下斐波那契查找的值小于key的话,为什么k要下调2个单位,谢谢
因为斐波拉契数列某一项等于前两项之和,所以要先得到k-1 k-2,才能得到key
不知道你这个问题是否已经解决, 如果还没有解决的话:查找最后一个小于key的元素,也就是说返回小于key的最右边元素下标。
// 查找最后一个小于key的元素
static int findLastSmaller(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 这里必须是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] >= key) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return right;
}
我很抱歉,我似乎回答错了问题。斐波那契查找算法中下调k值规则是指,在每一轮查找中,k的初始值为最小斐波那契数列中大于等于数组长度n的数,如果查找的元素比当前位置的元素小,则将查找范围左移两个位置,并将k值下调2个单位;如果查找的元素比当前位置元素大,则将查找范围左移一个位置,并将k值下调1个单位。这个规则可以减少查找次数,提高算法效率。下面是Python代码示例:
def fibonacciSearch(arr, target):
n = len(arr)
FibM_minus_2 = 0 # 初始化斐波那契数列的第n-2项
FibM_minus_1 = 1 # 初始化斐波那契数列的第n-1项
FibM = FibM_minus_2 + FibM_minus_1 # 初始化斐波那契数列的第n项
# 找到第一个大于等于n的斐波那契数列的数
while FibM < n:
FibM_minus_2 = FibM_minus_1
FibM_minus_1 = FibM
FibM = FibM_minus_2 + FibM_minus_1
# 表示数组中前一部分的长度为FibM_minus_2,后一部分的长度为FibM_minus_1
offset = -1
while FibM > 1:
# 确定中间的位置,并进行比较
i = min(offset + FibM_minus_2, n - 1)
if arr[i] < target:
# 需要查找的元素在后一部分,移动范围并更新斐波那契数列的前三项
FibM = FibM_minus_1
FibM_minus_1 = FibM_minus_2
FibM_minus_2 = FibM - FibM_minus_1
offset = i
elif arr[i] > target:
# 需要查找的元素在前一部分,移动范围并更新斐波那契数列的前三项
FibM = FibM_minus_2
FibM_minus_1 -= FibM_minus_2
FibM_minus_2 = FibM - FibM_minus_1
else:
# 找到了需要查找的元素
return i
# 对最后剩余的一个元素进行比较
if FibM_minus_1 and arr[offset+1] == target:
return offset+1
# 查找失败
return -1
希望这段代码能帮助您更好地理解斐波那契查找算法中下调k值的规则。