1、查找的简介
查找分为:静态查找和动态查找
静态查找:只做查找操作
动态查找:在查找的过程中同事2插入查找表中不存在的数据元素,或者删除存在的元素
查找的算法:
- 顺序查找(加入哨兵优化)
- 折半查找,插值查找,斐波那契查找(针对有序表的查找)
- 线性索引查找;稠密索引、分块索引、倒排序索引
2、查找算法的具体思路
1)顺序查找
顺序查找就是最简单的查找办法,通过for循环,遍历整个表,直到找到对应的查找的关键字key退出,或者遍历完没有找到退出。
// 数组a是查找的表,n为表中元素个数,注意从1开始存储,查找元素key
int search(int *a,int n,int key)
{
for(int i=1;i<=n;i++)
{
if(a[i]==key)
return i;
}
return 0; // 没有找到返回0
}
加入哨兵优化
普通顺序存储使用了for循环,里边每次需要进行i<=n
的判断,可以设置一个哨兵,减少这次判断
int search(int *a,int n,int key)
{
a[0] = key; // 设置的哨兵
int i = n;
while(a[i]!=key)
{
i++;
}
return i;
}
3)有序表的查找
折半查找
又称为二分查找,前提是线性表必须有序,采用顺序存储。每次查找时需要比较关键字和表中间元素的大小,根据比较结果决定继续在左半空间或右半空间继续进行查找。
复杂度为: O(log(n))
插值查找
和折半查找大体思路一样,区别在于折半查找每次比较的是中间元素,而插值查找每次比较的是
mid = low +(high-low) * (key-a[low]) / ( a[high] - a[low] )
复杂度和折半查找一样,适合于均匀分布的数据
斐波那契查找
和上边两种区别也只是选择比较的点不一样,它是利用了黄金分割原理实现。
总的来说这三种查到只是选择的分割点不一样,各有优劣
3)线性索引查找
稠密索引
将数据每个记录对应一个索引项(索引项按顺序排列,这样就可以使用折半等查找来找到)
分块索引
分块索引是把数据集记录分成若干块,并且这些块,块内无序,块间有序,针对块可使用折半等快速定位到key对应的块,在块中再使用顺序查找。
倒排序索引
根据属性值来查找记录