目录

7 查找

7.1 查找的基本概念

7.2 顺序查找和折半查找

7.2.1 顺序查找

7.2.2 折半查找

7.2.3 分块查找

7.3 B树和B+树

7.3.1 B树

7.3.2 B树的插入删除

7.3.3 B+树

7.4 散列表

7.4.1 散列查找


7 查找

7.1 查找的基本概念

查找——在数据集合中寻找满足某种条件的数据元素的过程称为查找

查找表(查找数据)——用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成

关键字——数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。

对查找表的常见操作:

1.查找符合条件的数据元素

2.插入,删除某个数据元素

查找算法的评价指标:

查找长度——在查找运算中,需要对比关键字的次数称为查找长度

平均查找长度——所有查找过程中进行关键字的比较次数的平均值

7.2 顺序查找和折半查找

7.2.1 顺序查找

顺序查找,又叫“线性查找”,通常用于线性表。

算法思想:从头到尾挨个找

代码实现:

typedef struct {//查找表的数据结构(顺序表)ElemType* elem;//动态数组基址int TableLen;//表的长度
}SSTable;
//顺序查找
int Search_Seq(SSTable ST, ElemType key) {int i;for (i = 0; i < ST.TableLen && ST.elem[i] != key; i++) {//查找成功,则返回元素下标;查找失败,则返回-1return i == ST.TableLen ? -1 : i;}
}

7.2.2 折半查找

折半查找又称“二分查找”,仅适用于有序的顺序表

//折半查找
int Binary_Search(SSTable L, ElemType key) {int low = 0, high = L.TableLen - 1, mid;while(low + high) {mid = (low + high) / 2;if (L.elem[mid] == key)return mid;else if (L.elem[mid] > key)high = mid - 1;elselow = mid + 1;}return -1;
}

折半查找判定树的构造:

如果当前low和high之间有奇数个元素,则mid分隔后,左右两部分元素个数相等

如果当前low和high之间有偶数个元素,则mid分隔后,左半部分比右半部分少一个元素

折半查找判定树中,若,则对于任何一个结点,必有:右子树结点数-左子树结点树=0或1

折半查找的判定树一定是平衡二叉树,折半查找的判定树中,只有最下面一层是不满的,因此,元素个数为n时树高

判定树结点关键字:左<中<右,满足二叉排序树的定义

失败结点:n+1个(等于成功结点的空链域数量)

折半查找的时间复杂度=

7.2.3 分块查找

算法思想:

1.在索引表中确定待查记录所属的分块(可顺序,可拆半)

2.在块内顺序查找

7.3 B树和B+树

7.3.1 B树

5叉查找树

最多1个关键字,2个分叉

最多4个关键字,5个分叉

struct Node {ElemType keys[4];//最多4个关键字struct Node* child[5];//最多五个孩子int num;//结点中有几个关键字
};

若每个结点内关键字太少,导致树变高,要查更多层结点,效率低

策略1:m叉查找树中,规定除了根节点外,任何结点至少[m/2]个分叉,即至少含有[m/2]-1个关键字

eg:对于5叉排序树,规定除了根节点外,任何结点都至少有3个分叉,2个关键字

如何保证查找效率:

策略2:m叉查找树中,规定对于任何一个结点,其所有子树的高度都要相同。

如果能同时满足策略1和策略2,那么这就是一棵B树

B树,又称为多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:

1.树中每个结点至多有m棵子树,即至多含有m-1个关键字

2.若根结点不是终端结点,则至少有两棵子树

3.除根结点外的所有非 叶子结点至少有[m/2]棵子树,即至少含有[m/2]-1个关键字

4.所有的叶结点都出现在同一层次上,并且不带信息(可以视为外部结点或类似于半折查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)

5.所有非叶结点的结构如下:

对于含有n个关键字的m叉B树,其树高h满足:

7.3.2 B树的插入删除

B树的插入:

5阶B树——结点关键字个数

即:

新元素一定是插入到最底层“终端节点”,用“查找”来确定插入位置

在插入key后,若导致原结点关键字数量超过上限,则从中间位置[m/2]将其中的关键字分为两部分,左部分包含的关键字放在原结点中,右部分包含的关键字放到新结点中,中间位置[m/2]的结点插入原结点的父结点。若此时导致其父结点的关键字个数也超过了上限,则继续进行这种分裂操作,直至这个过程传到根结点为止,进而导致B树高度增1。

B树的删除:

若被删除关键字在非终端节点,则用直接前驱或直接后驱来替代被删除的关键字

直接前驱:当前关键字左侧指针所指子树中“最右下”的元素

直接后继:当前关键字右侧指针所指子树中“最左下”的元素

对非终端结点关键字的删除,必然可以转化为对终端结点的删除操作

当右兄弟很宽裕时,用当前结点的后继,后继的后继来填补空缺

兄弟不够借。若被删除关键字所在结点删除前的关键字低于下限,且此时与该结点相邻的左,右兄弟结点的关键字个数均,则将关键字删除后与左(或右)兄弟结点及双亲结点中的关键字进行合并

在合并过程中,双亲结点中的关键字个数会减一,若其双亲结点时根结点且关键字个数减少至0,则直接将根结点删除,合并后的新结点成为根;若双亲结点不是根结点,且关键字个数减少到[m/2]-2则又要与它自己的兄弟结点进行调整或合并操作,并重复上述步骤,直至符合B树的要求为止。

7.3.3 B+树

一棵m阶的B+树需满足下列条件:

1.每个分支结点最多有m棵树(孩子结点)。

2.非叶根结点至少有两棵子树,其他每个分支至少有[m/2]棵子树。

3.结点的子树个数与关键字个数相等。

4.所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。

5.所有分支结点中仅包含它的各个结点中关键字的最大值指向其子结点的指针

在B+树中,非叶结点不含有该关键字对应记录的存储地址。可以使一个磁盘块可以包含更多个关键字,使得B+树的阶更大,树高更矮,读磁盘次数更少,查找更快

7.4 散列表

7.4.1 散列查找

散列表:又称哈希表,是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关。

通过散列函数(哈希函数)Addr=H(key)来建立关键字与存储地址的联系。

若不同的关键字通过散列函数映射 到同一个值,则称它们为“同义词”。通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”。

用拉链法(又称链接法,链地址法)处理“冲突”:把所有“同义词”存储在一个链表中

散列查找:

通过散列函数计算目标元素存储地址

常见的散列函数:

设计目标——让不同关键字的冲突尽可能地少

除留余数法——H(key)=key%p

散列表表长为m,取一个不大于m但最接近或等于m的质数p

用质数取模,分布更均匀,冲突更少。

tips:散列函数的设计要结合实际的关键字分布特点来考虑,不要教条化

直接定址法——H(key)=key或H(key)=a*key+b

其中,a和b时常数。这种方法计算最简单,且不会产生冲突。它适合关键字的分布基本连续的情况,若关键字分布不连续,空位较多,则会造成存储空间的浪费。

数字分析法——选取数码分布较为均匀的若干位作为散列地址

设关键字是r进制数,而r个数码在各位上出现的频率不一定相同,可能在某些位上分布均匀一些,每种数码出现的机会均等;而在某些位上分布不均匀,只有某几种数码经常出现,此时可选取数码分布较为均匀的若干位作为散列地址。这种方法适合于已知的关键字集合,若更换了关键字,则需要重新构造新的散列函数。

平方取中法——取关键字的平方值的中间几位作为散列地址

具体取多少位要视实际情况而定。这种方法得到的散列地址与关键字的每位都有关系,因此使得散列地址分布比较均匀,适用于关键字的每位取值都不够均匀或均小于散列地址所需的位数。

散列查找是典型的“用空间换时间”的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低

开放定址法:

是指可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。其数学递推公式为:

m表示散列表长;为增量序列;i可理解为“第i次发生冲突”

1.线性探测法——=0,1,2,3,...,m-1;即发生冲突时,每次往后探测相邻的下一个单元是否为空

2.平方探测法——当时,称为平方探测法,又称二次探测法其中

比起线性探测法更不容易产生“聚集”问题

散列表长度必须是一个可以表示成4j+3的素数,才能探测到所有位置

3.伪随机序列法——是一个伪随机序列,如

再散列法:

除了原始的散列函数H(key)之外,多准备几个散列函数,当散列函数冲突时,用下一个散列函数计算一个新地址,直到不冲突为止

数据结构笔记——第七章 查找相关推荐

  1. 【数据结构】第七章 查找

    第七章 查找 目录 第七章 查找 7.1 基本概念 7.2 顺序查找和折半查找 一.顺序查找 二.折半查找 三.分块查找 7.3 树形查找 一.二叉排序树(BST) 定义 查找具体值的代码实现 插入 ...

  2. 《数据结构》-第七章 查找(知识点总结)

    第七章 查找 本章开始介绍关于前几章这些数据结构的相应的运算-查找.关于查找的不同算法为每年考试考查的重点,主要分为线性结构的查找.树形结构的查找.散列结构的查找及字符串模式匹配,同时分析各个查找方法 ...

  3. 408数据结构考研笔记——第七章查找(命题重点)

    考点:折半查找的过程.构造判定树.分析平均查找时间             二叉排序树.平衡二叉树和红黑树了解概念.性质和相关操作             B树--插入删除和查找操作:B+树了解基本概 ...

  4. 数据结构笔记 第六章 查找技术

    查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...

  5. 【数据结构总结】第七章 查找

    第七章 查找 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读和浏览,加快记忆速度, ...

  6. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

  7. Effective C++ 学习笔记 第七章:模板与泛型编程

    第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...

  8. 2022天勤考研数据结构笔记 第2章 线性表

    2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...

  9. 【算法基础】数据结构导论第七章-排序.pptx

    上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 数据结构导论第三章-栈.队列和数组 数据结构导论第四章-树 数据结构导论第五章-图 数据结构 ...

最新文章

  1. tensorflow打印模型结构_Tensorflow上手1: Print与py_func
  2. Linux Shell常用技巧(十二) Shell编程
  3. Daily Scrum 10.26
  4. LayoutInflate部分源码解析
  5. 云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇
  6. 请求发送者与接收者解耦——命令模式
  7. 微服务架构下的身份认证
  8. Elasticsearch-mapper 基于注解方式生成mapping(2.0以上)
  9. 新录制了一个Cytoscape整合富集分析和基因表达的网络图绘制
  10. 树莓派做一个dns缓存
  11. android获取手机联系人信息(电话,邮箱,姓名,头像)
  12. 2022春山东大学人工智能导论期末题库附答案
  13. 【数学建模】CUMCM-2017A CT系统参数标定及成像 思路及部分代码
  14. 酒桌游戏c语言,必学的酒桌游戏,让你成为聚会中最亮的仔
  15. 拳皇 - 人物动作素材图 61种
  16. 微信小程序投诉页面与交互设计
  17. IBM X3650 服务器更换内存的过程记录
  18. dnf压爆服务器挑战网站,DNF手游压爆服务器挑战网址分享
  19. 常见的python图形-线性图
  20. 3D模型读取库:Assimp

热门文章

  1. k3客户端连接虚拟服务器如何设置,k3金蝶客户端连接服务器配置
  2. Arduino使用土壤湿度传感器
  3. C#——调整PropertyGrid列宽
  4. JCG Studios – ArkDroid Beta发布
  5. c jobstream html,黄冈市中考英语试卷
  6. vector基本用法大总结
  7. 思迪博(Stibo Systems)软件参展第二十二届高交会CHTF,融媒体聚焦,再获殊荣
  8. 侵害消费者信息安全,国内6家银行收到巨额罚单
  9. 移动端二倍精灵图,定位不准的处理做法
  10. 【敏捷2.1】精益开发与看板