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]high−low)×(target−array[low])
其中,low[low ]和 high[high]分别是数组的起始位置和结束位置,array[low] 和 array[high] 分别是对应位置的元素值。
2. 判断目标值位置
比较目标值与估计位置的大小关系,决定在左半部分还是右半部分继续查找。
3. 递归或迭代
根据比较结果,继续在选定的半部分进行插值查找,直到找到目标值或确定目标值不存在。
优点:
适用于均匀分布的数据集: 插值查找在数据集均匀分布时效果更为显著,能够更准确地估计目标值的位置。
相对于二分查找的改进: 在某些情况下,插值查找的效率较二分查找更高,尤其是对于近似均匀分布的数据。
缺点:
对于不均匀分布的数据效果不佳: 当数据分布不均匀时,插值查找的性能可能较差,甚至不如二分查找。
可能导致溢出: 在计算插值位置时,由于分母可能为零,导致除法溢出的风险。
5. 斐波那契查找
斐波那契查找算法是一种基于黄金分割的有序查找
算法,通过斐波那契数列
的特性,在有序序列中快速定位目标元素的位置。
原理介绍
它结合了二分查找和黄金分割的思想。这个算法的基本原理如下
-
序列构建: 首先,需要一个有序的数组或序列。这个数组的长度通常是斐波那契数列中的一个值,这有助于在查找过程中对数组进行分割。
-
斐波那契数列: 斐波那契数列是一组按以下递归关系定义的数字序列: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, …
-
查找过程: 对于一个
有序序列
,首先选择一个斐波那契数列中的值,使得这个值大于或等于待查找序列的长度,然后使用这个斐波那契数列的值将序列分成两个部分。这两个部分的长度之比就是相邻两个斐波那契数的比例。 -
比较: 比较要查找的元素与序列中分割点的元素。如果相等,则找到了目标元素;如果待查找元素小于分割点元素,继续在前半部分进行查找;如果待查找元素大于分割点元素,继续在后半部分进行查找。
-
迭代: 重复上述步骤,不断缩小查找范围,直到找到目标元素或确定元素不在序列中。
参考:【算法系列 | 12】深入解析查找算法之—斐波那契查找
6. 哈希查找
哈希查找,也称为散列查找,是一种高效的查找算法。它利用哈希函数将关键字映射到数组中的一个位置,通过直接访问该位置来获取元素,从而实现快速查找。
步骤:
- 创建一个哈希表,用于存储要查找的元素;
- 定义一个哈希函数,将要查找的关键字映射到数组中的一个位置;
- 根据哈希函数得到的位置,在哈希表中查找元素,如果找到则返回该元素;
- 如果哈希表中的该位置为空,说明查找失败;
- 如果哈希表中的该位置不为空,但元素与要查找的关键字不匹配,根据哈希函数的冲突处理策略,继续查找下一个位置;
- 重复步骤3至5,直到找到元素或者确定查找失败。
适用场景
- 快速查找:哈希查找能够在常数时间内(O(1))查找目标元素,适用于需要快速查找的场景。
- 大数据量:当数据量较大时,哈希查找可以提供较快的查找速度,适用于大数据量的查找操作。
- 需要频繁查找:如果需要频繁进行查找操作,哈希查找可以提高查找效率。
参考:查找算法之哈希查找
以下两种查找不好做笔记,先空着