前言
主要对各类查找算法的思想分析和复杂度分析
顺序表查找算法
1、思想
从表中的第一个元素开始查起,逐个与给定值进行对比,直到查找成功或者下标越界失败
2、复杂度分析
由于是逐个查找,因此复杂度为O(n)
折半查找
1、思想
要求被查找的线性表必须按照顺序存储,然后以一种二分法的思想,进行与给定值比较,等值则查找成功,若所有查找区域无记录,则失败。
代码思路:分别定义最低下标和最高下表,然后取中间未知下表的值与给定值的大小做比较,要么成功要么判断给定值在上半个区间还是下半个区间,然后对最低下标和最高下表重新赋值
2、复杂度分析
借助于二叉排序树的查找,相当于具有n个数据的线性表放入二叉排序树,最快情况是1次成功,最慢是找到了叶子结点还没找到,则为log2 n + 1,因此时间复杂度为O(log n)
插值查找
1、思想
类似于折半查找,只不过不是以1/2进行分,而是将1/2进行改进,利用插值的计算公式mid=low + (key - a[low])×(high - low)/(a[high] - a[low])。
2、复杂度分析
时间复杂度也是O(logn),适合表长较长并且分布比较均匀的有序表
斐波那契查找
1、思想
利用最接近查找长度的斐波那契值来确定拆分点,若有序表长度不够则由最大的树来补充,然后比较拆分点的值与关键值的比较确定是否成功或者重新确立新的查找范围,若key
哈希表查找
1、思想
(1)在存储的时候就对记录进行哈希函数求值,然后根据求出来的哈希值作为该记录的实际存储地址。
(2)在查找的时候就对要查找的记录进行相同哈希函数求值,得到哈希地址,再根据这个散列值去找。
2、复杂度
理想情况,不产生哈希冲突,一次找,因此时间复杂度为O(1),但是当会产生哈希冲突的时候,平均查找长度取决余装填因子(记录个数/散列表长度),这个值越小,越不容易产生哈希冲突,可以俑空间换时间
3、如何构造散列函数(哈希函数)
直接地址法(取关键字的线性函数作为散列函数)、数字分析法、平方取中法、除余求余法(最常用)
4、如何解决散列冲突
开放地址法:发生冲突,就去找下一个空的散列地址,只要足够大总能存储
对于开放地址产生得哈希冲突,采用线性探测法(对哈希值+值后再求余)或者二次探测法(对哈希值+平方再求余)
再散列函数:产生了一个哈希冲突,就立即用另一个哈希函数计算,总能解决这个冲突
链地址法:将关键字具有同义得记录用单链表存储起来,用一个头指针来表明是同义词得链表,可以称为哈希俑,查找时会带来遍历单链表的性能消耗
公共溢出区法:凡是有冲突的关键值都会被专门安排在一个地方存储,查找时先找基本表,找不到再去公共区溢出表查找