八大查找算法(个人笔记)

1. 顺序查找

无序列表的查找算法,又称线性查找
适用于线性表的顺序存储结构和链式存储结构。
时间复杂度为O(n)
基本思想:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。
优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。
缺点:是当n 很大时,平均查找长度较大,效率低;

2. 二分查找

二分查找(Binary Search),是一种在有序数组中查找某一特定元素的查找算法。查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。
这种查找算法每一次比较都使查找范围缩小一半。

3. 分块查找

要求是顺序表,分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
基本思想:
将n个数据元素"按块有序"划分为m块(m ≤ n)。
每一块中的结点不必有序,但块与块之间必须"按块有序";
即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;
而第2块中任一元素又都必须小于第3块中的任一元素,以此类推·······

4. 插值查找

插值查找是一种改良版的二分查找算法,其基本原理是根据要查找的值在有序数组中的大致位置进行估计,以此来缩小搜索范围,从而提高查找效率。
插值查找的核心思想是通过数据的分布情况来预测目标值的位置,从而更快地逼近目标
特别适用于有序且均匀分布的数据集
插值查找的实现步骤
1. 计算插值位置
首先,通过插值公式计算目标值在数组中的估计位置:
p o s = l o w + ( h i g h − l o w a r r a y [ h i g h ] − a r r a y [ l o w ] ) × ( t a r g e t − a r r a y [ l o w ] ) pos=low + (\frac{high-low}{array[high]-array[low]}) \times (target-array[low]) pos=low+(array[high]array[low]highlow)×(targetarray[low])
其中,low[low ]和 high[high]分别是数组的起始位置和结束位置,array[low] 和 array[high] 分别是对应位置的元素值。

2. 判断目标值位置
比较目标值与估计位置的大小关系,决定在左半部分还是右半部分继续查找。

3. 递归或迭代
根据比较结果,继续在选定的半部分进行插值查找,直到找到目标值或确定目标值不存在。

优点:
适用于均匀分布的数据集: 插值查找在数据集均匀分布时效果更为显著,能够更准确地估计目标值的位置。
相对于二分查找的改进: 在某些情况下,插值查找的效率较二分查找更高,尤其是对于近似均匀分布的数据

缺点:
对于不均匀分布的数据效果不佳: 当数据分布不均匀时,插值查找的性能可能较差,甚至不如二分查找。
可能导致溢出: 在计算插值位置时,由于分母可能为零,导致除法溢出的风险。

参考:【算法系列 | 11】深入解析查找算法之—插值查找

5. 斐波那契查找

斐波那契查找算法是一种基于黄金分割的有序查找算法,通过斐波那契数列的特性,在有序序列中快速定位目标元素的位置。

原理介绍
它结合了二分查找和黄金分割的思想。这个算法的基本原理如下

  1. 序列构建: 首先,需要一个有序的数组或序列。这个数组的长度通常是斐波那契数列中的一个值,这有助于在查找过程中对数组进行分割。

  2. 斐波那契数列: 斐波那契数列是一组按以下递归关系定义的数字序列:F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n > 1)。通常,斐波那契数列的前几项是:0, 1, 1, 2, 3, 5, 8, 13, 21, …

  3. 查找过程: 对于一个有序序列,首先选择一个斐波那契数列中的值,使得这个值大于或等于待查找序列的长度,然后使用这个斐波那契数列的值将序列分成两个部分。这两个部分的长度之比就是相邻两个斐波那契数的比例。

  4. 比较: 比较要查找的元素与序列中分割点的元素。如果相等,则找到了目标元素;如果待查找元素小于分割点元素,继续在前半部分进行查找;如果待查找元素大于分割点元素,继续在后半部分进行查找。

  5. 迭代: 重复上述步骤,不断缩小查找范围,直到找到目标元素或确定元素不在序列中。

参考:【算法系列 | 12】深入解析查找算法之—斐波那契查找

6. 哈希查找

哈希查找,也称为散列查找,是一种高效的查找算法。它利用哈希函数将关键字映射到数组中的一个位置,通过直接访问该位置来获取元素,从而实现快速查找。
步骤:

  • 创建一个哈希表,用于存储要查找的元素;
  • 定义一个哈希函数,将要查找的关键字映射到数组中的一个位置;
  • 根据哈希函数得到的位置,在哈希表中查找元素,如果找到则返回该元素;
  • 如果哈希表中的该位置为空,说明查找失败;
  • 如果哈希表中的该位置不为空,但元素与要查找的关键字不匹配,根据哈希函数的冲突处理策略,继续查找下一个位置;
  • 重复步骤3至5,直到找到元素或者确定查找失败。

适用场景

  • 快速查找:哈希查找能够在常数时间内(O(1))查找目标元素,适用于需要快速查找的场景。
  • 大数据量:当数据量较大时,哈希查找可以提供较快的查找速度,适用于大数据量的查找操作。
  • 需要频繁查找:如果需要频繁进行查找操作,哈希查找可以提高查找效率。

参考:查找算法之哈希查找

以下两种查找不好做笔记,先空着

7.B树查找

8.二叉树查找(BST)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锦鳞 百跃升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值