数据结构与算法(查找)

时间:2024-03-21 07:27:40

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)
    数据结构与算法(查找)
    数据结构与算法(查找)
    例如下面的例子:
    数据结构与算法(查找)
    从散列表的查找过程可知:
    数据结构与算法(查找)