数据结构之查找

线性结构

顺序查找

  • 适用条件:
    适用于线性表

  • 基本思想:
    从线性表的一段开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定的条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端,但还没有查找到符合给定条件的元素,则返回查找失败的信息。

  • 具体实现:

typedef struct {    //查找表的数据结构
    ElemType *data;     //元素空间基址,建表时按实际长度分配,0号单元留空
    int length;     //表的长度
}List;      //Sequential Search Table

//在顺序表L中顺序查找关键字为key的元素。若找到则返回该元素在表中的位置
int Search_Seq(List L, ElemType key) {
    L.data[0] = key;        //“哨兵”
    for(i = L.length; L.data[i] != key; --i);       //从后往前找
    return i;       //如果表中不存在key,则会找到第0号(哨兵),返回0
}

引入哨兵的目的是使得函数内的循环不用每次都判断数组是否会越界,因为满足i==0时,函数一定会跳出。可以避免很多不必要的判断语句,从而提高程序效率。

缺点是当n较大时,平均查找长度较大,效率低;优点是对数据元素的存储没有需求,顺序存储或链式存储皆可;对表中记录的有序性也没有要求,无论记录是否按关键码有序,均可应用。

PS:线性的链表只能进行顺序查找

折半查找

  • 适用条件:
    仅适用于有序的顺序表

  • 基本思想:
    首先将给定值key与表中中间位置元素的关键字比较,若相等,则查找成功,返回该元素存储位置,若不等,则所需查找的元素只能在中间元素以外的左半部分或右半部分,然后再缩小的范围内继续进行同样的查找,如此重复,直到找到为止;或确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。

  • 具体实现:

//在有序表L中查找关键字为key的元素,若存在则返回其位置,不存在则返回-1
int Binary_Search(SeqList L, ElemType key) {
    int low = 0, high = L.length-1, mid;
    while(low <= high) {
        mid = (low + high) / 2;         //mid取中间值
        if(key == L.data[mid]) {        //key刚好等于中间值
            return mid;
        }else if(key < L.data[mid]) {   //key小于中间值
            high = mid - 1;             //在左半边部分查找
        }else {                         //key大于中间值
            low = mid + 1;              //在右半边部分查找
        }
        return -1;      //当循环结束(low >high)说明查找失败了
    }
}

因为折半查找需要方便地定位查找区域,所以适合折半查找的存储结构必须具有随机存取的特性。因此,该查找法仅适合于线性的顺序存储结构,不适合于链式存储结构,且要求元素按关键字有序排列。

分块查找

  • 基本思想:
    将查找表分为若干个子块。块内的元素可以无序,但块之间是有序的(即第一个块中的最大关键字小于第二个块中的所有记录的关键字,以此类推)。再建立一个索引表,索引表中的每个元素含有各块的最大关键字和各块中的第一个元素的地址,索引表按关键字有序排列
    查找过程分为两步:第一步是在索引表中确定待查记录所在的块,可以顺序查找折半查找索引表;第二步是在块内顺序查找

  • 具体实现:

//未完待续

树形结构

二叉排序树

二叉平衡树

B树、B+树

散列结构

散列表

转载于:https://www.cnblogs.com/blknemo/p/11232918.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值