查找(一)

1、查找的简介

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

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

查找的算法:

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

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对应的块,在块中再使用顺序查找。
倒排序索引
根据属性值来查找记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值