目录:
二: 动态查找表(Dynamic Search Table)
三:顺序查找(Sequential Search)【线性查找】
四:折半查找(Binary Search)【二分查找】【有序表查找】
一:静态查找表(Static Search Table)
只作查找操作的查找表
主要操作:
(1)查询某个 ”特定的“ 数据元素是否在查找表中
(2)检索某个 ”特定的“ 数据元素和各种属性
静态查找表只是查询
1.顺序查找表【线性查找】:从线性表一端开始扫描,将扫到的关键字与给定值比较,相同则查找成功 2.有序表查找【折半查找】【二分查找】:若线性表有序,则可以折半查找 折半查找升级版为插值查找,及不取1/2处。斐波那契查找,也是折半查找的变种 3.索引顺序表查找【分块查找】:效率介于1)2)之间 又称分块查找。块与块之间有序,块内无序。实际进行两次查找,第一次折半查找,第二次顺序查找
二: 动态查找表(Dynamic Search Table)
在查找过程中同时插入查找表中不存在的数据元素
或者从查找表中删除已经存在的某个数据元素
主要操作:
(1)查找时插入数据元素
(2)查找时删除数据元素
动态查找表可以对查找表结构进行修改
相比于静态查找表,查找过程中会修改元素
三:顺序查找(Sequential Search)【线性查找】
也叫 线性查找
1.查找过程
是最基本的查找技术,它的查找过程是:
A:从表中第一个(或最后一个)记录开始
B:逐个进行记录的关键字和给定值比较
C:若某个记录的关键字等于给定值,则查找成功
D:如果直到最后一个(或第一个)记录,仍然找不到关键字与给定值相等的记录,则查找失败
2.时间复杂度
顺序查找的时间复杂度为
四:折半查找(Binary Search)【二分查找】【有序表查找】
又叫 二分查找
它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储
1.查找过程
二分查找的基本思想是:
在有序表中
A:取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功
B:若给定值小于中间记录的关键字,则在中间记录的左半区继续查找
C:若给定值大于中间记录的关键字,则在中间记录的右半区继续查找
D:不断重复上述过程,直到查找成功
或所有查找区域无记录,查找失败为止
2.时间复杂度
二分查找的时间复杂度为
3.二分查找在静态查找表&动态查找表
由于 二分查找 的前提条件是要求集合有序
A:静态查找表
因此,对于静态查找表,一次排序后不再变化,这样的算法已经比较好了
B:动态查找表
但对于需要频繁执行插入或删除操作的数据集(动态查找表)来说
维护有序的排序会带来不小的工作量,那就不建议使用
五:插值查找(Interpolation Search)
1.查找过程
根据要查找的关键字 key
与查找表中的最大最小记录的关键字比较后的查找方法
其核心在于插值计算公式:
2.插值查找&二分查找的异同
A:同
插值查找 与 二分查找 的时间复杂度都是
B:异
但对于表长较大,而关键字分布又比较均匀的查找表来说
插值查找算法的平均性能比二分查找要好的多
(因为,二分查找是折半查找
而插值查找会根据要查找的 key 计算得出其在整个查找表中的权重得到的位置会更接近 key 的位置)
反之,数组中如果分布类似
这种极端不均匀的数据
用插值查找未必是很合适的选择
六:斐波那契查找(Fibonacci Search)
1.查找过程
斐波那契查找与二分查找和插值查找都是有序查找算法
不过其是利用了黄金分割原理来实现的
其核心算法为:
A:当
时,查找成功
B:当
时,新范围是第 low 个到第 mid-1 个,此时范围个数为
个
C:当
时,新范围是第 m+1 个到第 high 个,此时范围个数为
个
2.时间复杂度
管斐波那契查找的时间复杂度也为
3.二分查找&插值查找&斐波那契查找的异同
A:同
二分查找,插值查找 和 斐波那契查找 都是有序查找算法
它们的本质其实是相同的,都是选择序列中间的某个位置与给定值进行比较
依据序列的有序性,每次查找都可以去除两端一部分序列,从而提升查找性能
B:异
三者的区别仅在与中间位置的选择策略不同:
二分查找直接取序列中点作为 mid
插值查找按给定值在序列的权重(比例)作为 mid
斐波那契查找是用序列的黄金分割点(即:
)作为 mid
但就平均性能来说,斐波那契查找要优于二分查找
还有一点比较关键的地方
二分查找是进行加减法与除法运算:
mid=low+(high-low)/2
插值查找进行复杂的四则运算:
mid=low+(high-low)*(key-a[low])/(a[high]-a[low])
斐波那契查找只是最简单的加减法运算:
mid=low+F[k-1]-1
在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率
七:索引顺序表查找【分块查找】
索引顺序查找,又称分块查找
是顺序查找的一种改进
1.性能
其性能介于顺序查找和折半查找之间
2.查找过程
A:分块查找把线性表分成若干块
每一块中的元素存储顺序是任意的
但是块与块之间必须是按关键字大小排序
(即前一块中的最大关键字大于(或小于)后一块中的最小(或最大)关键字值)。
B:另外,需要建立一个索引表
索引表中的一项对应线性表中的一项
索引表按关键字值递增(或递减)顺序排列
索引项由关键字域和链域组成
关键字域存放相应块的最大关键字
链域存放指向本块第一个结点的指针
索引表查找算法:实际上进行了两次查找(折半查找+顺序查找)
因此整个算法的平均查找长度是两次查找的平均查找长度之和