数据结构与算法(查找)

7. 查找

7.1 基本概念

1、查找表:用于查找的数据集合,由同一类型的数据元素组成,经常进行的操作:
在这里插入图片描述
2、静态查找表:无需动态修改查找表的操作,都是静态查找表。适合的查找方法有顺序查找、折半查找、散列查找。
3、动态查找表:需要动态插入或删除的操作。适合的查找方法有二叉排序树查找、散列查找。
4、关键字:数据元素中唯一表示该元素的某个数据项的值。
5、平均查找长度:所有查找过程中进行关键字比较次数的平均值。
在这里插入图片描述

7.2 顺序查找

在这里插入图片描述
1、一般线性表的顺序查找
从线性表的一端开始,逐个检查关键字,当查找的某个关键字符合条件,则查找成功,返回元素在线性表中的位置,当将所有的关键字都查找一遍没有符合条件的元素,则返回查找失败的信息。
在这里插入图片描述
该算法中的哨兵目的是使得search_seq中的循环不必判断数组是否越界,当满足i==0,哨兵跳出。
在这里插入图片描述
在这里插入图片描述
2、有序表的顺序查找
在这里插入图片描述
在这里插入图片描述
树中的矩形节点称为失败节点(n个节点有n+1个查找失败节点)。
在这里插入图片描述

7.3 折半查找

仅用于有序顺序表
首先将给定值key与表中中间位置的元素比较,当相等则查找成功,返回该元素的存储位置;当不相等则需要查找的元素只能在中间元素以外的前半部分或后半部分,然后在缩小的范围内继续进行同样的查找,如此反复,直到找到为止,当确定没有需要查找的元素,则查找不成功,返回失败信息。
算法伪代码如下:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
该算法需要方便的定位查找区域,因此要求线性表必须有随机存取的特性。该算法仅适合顺序存储结构,不适合链式存储结构,元素按关键字有序排序。

7.3 分块查找

称为索引顺序查找,既有动态结构,适合快速查找
将查找表分为若干子块,块内元素可无序,块间有序,即前一个块中的最大元素小于后一个块中的最小元素。建立一个索引表,索引表中的每个元素含有各块的最大关键字和各块中的第一个元素的地址,索引表按关键字有序排列。
分块查找的过程:
(1)在索引表中确定待查记录所在的块,可以顺序或折半查找,
(2)在块内顺序查找
分块查找的平均查找长度为索引查找和块内查找的平均查找长度之和。设L1和Ls分贝时索引查找和块内查找的平均查找长度,则该算法的平均查找长度:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4 B树和B+树

1、B树及其基本操作
又称多路平衡查找树,B树中所有节点的孩子个数的最大值称为B树的阶,一般用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述B树中所有节点的最大孩子数m=5。该树有如下性质:
在这里插入图片描述

  • B树的高度(磁盘存取次数)
    B树的高度不包含最后一层的叶节点。
    当n>=1,则对任意一棵包含n个关键字,高度为h,阶数为m的B树:
    在这里插入图片描述

  • B树的查找
    B树的查找包含连个基本操作:
    (1)在B树中找节点
    (2)在节点内找关键字
    因为B树一般在磁盘中,因此第一步的查找在磁盘上进行,第二步操作是在内存中进行,即在找到目标节点,先将节点信息读入内存中,然后在节点内采用顺序查找或折半查找。

  • B树的插入
    (1)定位:找出插入该关键字的最底层中的某个非叶节点
    (2)插入:在B树中,每个非失败节点的关键字个数都在区间在这里插入图片描述中。插入后的节点关键字个数小于m,可直接插入;插入后检查被插入节点内关键字的个数,当插入后的节点关键字个数大于m-1时,必须对节点进行分裂。
    在这里插入图片描述

  • B树的删除
    当被删关键字k不在终端节点中,可以用k的前驱(后继)k’替代k,在相应的结点中删除k’,关键字k’一定在某个终端节点中,转换成被删关键字在终端节点中的情形。
    当被删关键字在终端节点(非叶节点)中时:
    在这里插入图片描述
    2、B+树概念
    一颗m阶的B+树满足下列条件:
    在这里插入图片描述
    在这里插入图片描述

  • m阶的B+树和m阶的B树主要差异:
    在这里插入图片描述

7.5 散列表

1、 散列表概念
在这里插入图片描述
理想情况,对散列表进行查找的时间复杂度为O(1),与表中元素数量无关。

2、散列函数的构造方法
散列函数的定义域必须包含全部需要存储的关键字,值域范围依赖散列表的大小或地址范围。
散列函数的地址应该是等概率,均匀分布在整个地址空间中,减少冲突发生。
散列函数应简单,在较短时间内计算任意关键字对应的散列地址。

  • 直接定址法
    在这里插入图片描述

  • 除留余数法
    在这里插入图片描述

  • 数字分析法
    在这里插入图片描述

  • 平方取中法
    在这里插入图片描述

3、处理冲突的方法
用Hi表示处理冲突中第i次探测得到的散列地址,假设得到的另一个散列地址H1冲突,则继续找下一个地址。

  • 开放定址法
    指可存放新表项的空闲地址可以向它的同义词表项开放,又向非同义词表项开放。
    在这里插入图片描述
    (1)线性探测法
    在这里插入图片描述
    (2)平方探测法
    在这里插入图片描述
    (3)再散列法
    在这里插入图片描述
    (4)伪随机序列法
    当di=伪随机数序列时,称为伪随机序列法。
  • 拉链法

    在这里插入图片描述
    在这里插入图片描述
    4、散列查找及性能分析
    对于一个给定的关键字key,根据散列函数可以计算出其散列地址,执行步骤如下:
    初始化:addr=hash(key)
    在这里插入图片描述
    在这里插入图片描述
    例如下面的例子:
    在这里插入图片描述
    从散列表的查找过程可知:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值