查找(一)

来源:互联网 发布:怎么修改tomcat的端口 编辑:程序博客网 时间:2024/05/18 02:58

1、查找的简介

查找分为:静态查找和动态查找

静态查找:只做查找操作
动态查找:在查找的过程中同事2插入查找表中不存在的数据元素,或者删除存在的元素

查找的算法:

  1. 顺序查找(加入哨兵优化)
  2. 折半查找,插值查找,斐波那契查找(针对有序表的查找
  3. 线性索引查找;稠密索引、分块索引、倒排序索引

2、查找算法的具体思路

1)顺序查找

顺序查找就是最简单的查找办法,通过for循环,遍历整个表,直到找到对应的查找的关键字key退出,或者遍历完没有找到退出。

// 数组a是查找的表,n为表中元素个数,注意从1开始存储,查找元素keyint 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对应的块,在块中再使用顺序查找。
倒排序索引
根据属性值来查找记录

原创粉丝点击