1、顺序查找(Sequential Search)
1.1 定义:
顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法.
1.2 原理:
对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。
1.3 步骤:
1)从列表的第一个元素开始。
2)逐个将列表中的元素与目标值进行比较。
3)如果找到与目标值相等的元素,则返回该元素的位置。
4)如果直到列表的最后一个元素都没有找到目标值,则返回未找到的标记(如-1)。
1.4 特点:
实现简单,无需对数据集进行任何预处理。
时间复杂度为O(n),其中n为数据集的元素个数。
适用于小型数据集或未排序的数据集。
2、分块查找(Block Search)
2.1 定义:
分块查找是折半查找和顺序查找的一种改进方法,特别适合于节点动态变化的情况。
2.2 原理:
将大的线性表分解成若干块,块内元素无序,块间有序。查找时先在索引表中进行查找,确定待查元素所在的块,然后在该块内使用顺序查找。
2.3 步骤:
1)建立一个索引表,其中每个元素包含对应块的最大值和块的起始位置。
2)使用二分查找或其他方法在索引表中查找目标值可能所在的块。
3)在找到的块中,使用顺序查找方法查找目标值。
2.4 特点:
提高了查找效率,比顺序查找快,但比二分查找慢。
索引表需占用额外空间,其大小取决于块的数量。
适用于数据量大、动态更新频繁的场景。
3、二分查找(Binary Search)
3.1 定义:
二分查找也称折半查找,是一种效率较高的查找方法。
3.2 原理:
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,根据比较结果缩小查找范围,直到找到满足条件的记录或查找失败。
3.3 步骤:
1)确保列表已排序。
2)初始化两个指针,一个指向列表的开始,一个指向列表的结束。
3)计算中间位置。
4)将目标值与中间位置的值进行比较。
5)如果目标值等于中间值,则返回中间位置;
如果目标值小于中间值,则在左半部分重复步骤3-5;
如果目标值大于中间值,则在右半部分重复步骤3-5;
如果直到列表的一半都没有找到目标值,则返回未找到的标记。
3.4 特点:
要求线性表必须采用顺序存储结构,且表中元素按关键字有序排列。
时间复杂度为O(log n),其中n为数据集的元素个数。
查找速度快,适用于有序数据集。
4、哈希查找(Hashing)
4.1 定义:
哈希查找是通过计算数据元素的存储地址进行查找的一种方法。
4.2 原理:
使用哈希函数将数据元素映射到哈希表的某个位置,然后在该位置进行查找。
4.3 步骤:
1)定义一个哈希函数,该函数将关键字映射到哈希表中的位置。
2)使用哈希函数计算目标值的哈希地址。
3)如果哈希地址对应的存储位置为空,则查找失败。
如果哈希地址对应的存储位置与目标值相等,则查找成功。
如果哈希地址对应的存储位置与目标值不等,则使用冲突解决方法(如开放地址法或链地址法)处理冲突,并继续查找。
4.4 特点:
查找速度快,查找效率基本与数据量大小无关。
需要设计良好的哈希函数和冲突解决方法。
适用于数据量大、对查找速度要求高的场景。
5、插值查找(Interpolation Search)
5.1 定义:
插值查找是有序表的一种查找方式,基于二分查找改进,将查找点的选择改进为自适应选择。
5.2 原理:
根据查找关键字与查找表中最大最小记录关键字比较后的结果,估计关键字在查找表中的位置,然后在估计位置附近进行查找。
5.3 步骤:
1)确定查找范围,即有序列表的最小值和最大值。
2)使用插值公式计算目标值在列表中的大致位置。
3)将计算出的位置处的元素与目标值进行比较。
如果相等,则返回该位置。
如果目标值小于该位置处的元素,则在左侧子列表中重复步骤2-4。
如果目标值大于该位置处的元素,则在右侧子列表中重复步骤2-4。
如果直到列表的某个子列表为空都没有找到目标值,则返回未找到的标记。
5.4 特点:
要求查找表是顺序存储的有序表,且数据元素的关键字在查找表中均匀分布。
在关键字分布均匀的情况下,性能优于二分查找。
适用于有序数据集,且数据分布较为均匀的场景。