数据结构与算法__02--斐波那契查找、数组中元素个数的说明为F[k]-1

简介: 代码中数组中元素个数的说明为F[k],经过分析我们可以发现实际使用的只有F[k]-1,所以temp数组中元素个数为F[k]-1更为合理。

1 斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

一句话:第三项起,数列的每一个元素等于前两个元素之和。

2 斐波那契查找

2.1 定义

斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术。斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。

一句话:通过使用斐波那契数列完成查找

2.2 常规基本步骤

  1. 构建斐波那契数列,对查找表填充,以查找表最后一个元素填充至最接近的斐波那契数列中的元素 F(k)-1;
  2. 确定查找点 mid = low+F(k-1)-1;
  3. 判断中间值 temp[mid] 和目标值的关系,确定下一步策略:

    • 如果目标值小于中间值,说明目标值在左区间。由于左区间长度为 F(k-1),因此 k 应该更新为k-1,然后再次执行 2、3 两步,具体可看下图所示;
    • 如果目标值大于中间值,说明目标值在右区间。由于右区间长度为 F(k-2),因此 k 应该更新为 k-2,然后再次执行 2、3 两步,具体可看下图所示;
    • 如果目标值等于中间值,说明找到了目标值。但此时还需判别该目标值是原查找表中的元素还是填充元素;
  4. 判断填充值位置:

    • 若是原查找表temp中的元素,直接返回索引;
    • 如果是填充元素,则返回原查找表temp的最后一个元素的索引,即 temp.length-1。

    (PS:因为扩展数组是以原查找表最后一个元素来填充,如果目标值是填充元素,则说明原查找表最后一个元素值就是目标值)

3 问题解决

韩顺平老师代码中数组中元素个数的说明为F[k],经过分析我们可以发现实际使用的只有F[k]-1,所以temp数组中元素个数为F[k]-1更为合理。查找过程如下图所示:
请添加链接描述

public static int[] fib() {
    int[] f = new int[maxSize];
    f[0] = 1;
    f[1] = 1;
    for (int i = 2; i < maxSize; i++) {
        f[i] = f[i - 1] + f[i - 2];
    }
    return f;
}
public static int fibSearch(int[] a, int key) {
    ......
    //创建新数组的部分代码
    int[] temp = Arrays.copyOf(arr, f[k]-1);
    for(int i = high + 1; i < temp.length; i++) {
        temp[i] = a[high];
    } 
    ......
}  
相关文章
|
2月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
45 6
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
54 3
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
43 0
|
21天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
43 5
|
28天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
46 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
45 4
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
26 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
31 0
|
2月前
|
算法 Java 编译器
【递归算法】斐波那契变形问题(C/C++)
【递归算法】斐波那契变形问题(C/C++)