《数据结构教学课件》第11章.ppt_第1页
《数据结构教学课件》第11章.ppt_第2页
《数据结构教学课件》第11章.ppt_第3页
《数据结构教学课件》第11章.ppt_第4页
《数据结构教学课件》第11章.ppt_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章查找 查找的基本概念静态查找表动态查找表哈希表 主要知识点 11 1查找的基本概念 是指在数据集合中查询是否存在关键字等于某个给定关键字的数据元素的过程 亦称作检索 主关键字 次关键字 能够惟一区分各个不同数据元素 通常不能惟一区分各个不同数据元素 查找结果 查找成功 查找不成功 查找概念 11 1查找的基本概念 是指在数据集合中查询是否存在关键字等于某个给定关键字的数据元素的过程 亦称作检索 查找表 查找概念 以集合为逻辑结构 以查找为核心运算 包括其他运算的数据结构 静态查找 只查找 不改变数据元素集合内的数据元素 动态查找 既查找 又改变 增减 集合内的数据元素 查找分类 静态查找表 动态查找表 查找表的存储结构是否发生变化 平均查找长度 查找过程所需进行的关键字比较次数的平均值 其数学定义为 查找算法效率 该指标是衡量查找算法效率的最主要标准 查找的第i个数据元素出现的概率 查找的第i个数据元素所需的关键字比较次数 成功的平均查找长度 查找数据元素 一个数据 数据类型是自定义的结构类型 typedefstruct intnum charname 20 charsex DataType 定义要查找数据元素的结构体为 typedefstruct KeyTypekey DataType 11 2静态查找表 静态查找表主要有三种结构 顺序表有序顺序表索引顺序表 1 顺序表 在顺序表上查找的基本思想是 从顺序表的一端开始 用给定数据元素的关键字逐个和顺序表中各数据元素的关键字比较 若在顺序表中查找到要查找的数据元素 则查找成功 函数返回该数据元素在顺序表中的位置 否则查找失败 函数返回 1 list size 6 MaxSize 1 0 1 2 3 4 5 6 a0 a1 a2 a3 a4 a5 include SeqList h intSeqSearch SeqListS DataTyex inti 0 while i S size 查找函数设计如下 顺序表 结构数组 结构数组中某个元素的某个成员 查找函数设计如下 数组 intSeqSearch DataTypea intn KeyTypekey inti 0 while i n 查找成功时的平均查找长度ASL为 第1个元素查找成功需要比较的次数为1 第2个元素查找成功需要比较的次数为2 第3个元素查找成功需要比较的次数为3 第n个元素查找成功需要比较的次数为n 2 有序顺序表 有序顺序表上的查找算法主要有顺序查找和折半查找两种方法 一 顺序查找有序顺序表上的顺序查找算法和顺序表上的查找算法方法类同 二 二分查找 又称折半查找 算法的基本思想 先给数据排序 例如按升序排好 形成有序表 然后再将key与正中元素值相比 若key小 则缩小至前半部内查找 再取其中值比较 每次缩小1 2的范围 直到查找成功或失败为止 反之 如果key大 则缩小至后半部内查找 intBinarySearch SeqListS DataTypex intlow 0 high n 1 确定初始查找区间上下界intmid while low high mid low high 2 确定查找区间中心下标if S list mid key x key returnmid 查找成功elseif S list mid key x key low mid 1 elsehigh mid 1 return 1 查找失败 二分查找算法如下 算法效率分析 平均查找长度ASL为 1次比较就查找成功的元素有1个 20 即中间值 2次比较就查找成功的元素有2个 21 即1 4处 或3 4 处 3次比较就查找成功的元素有4个 22 即1 8处 或3 8 处 4次比较就查找成功的元素有8个 23 即1 16处 或3 16 处 则第m次比较时查找成功的元素会有 2m 1 个 为方便起见 假设表中全部n个元素 2m 1个 此时就不讨论第m次比较后还有剩余元素的情况了 3 索引顺序表 当顺序表中的数据元素个数非常大时 采用在顺序表上建立索引表的办法提高查找速度 把要在其上建立索引表的顺序表称作主表 主表中存放着数据元素的全部信息 索引表中只存放主表中要查找数据元素的主关键字和索引信息 顺序表 有序顺序表 当表很长时 效率都不高 这是一种顺序查找的另一种改进方法 先让数据分块有序 即分成若干子表 要求每个子表中的数值 用关键字更准确 都比后一块中数值小 但子表内部未必有序 然后将各子表中的最大关键字构成一个索引表 表中还要包含每个子表的起始地址 即头指针 索引表 最大关键字 起始地址 第1块 第2块 第3块 22 48 86 例 特点 块间有序 块内无序 位置01234567891011121314151617 索引表中的数据元素由两个域构成 key域为被索引的若干个数据元素中关键字的最大值 link域为被索引的若干个数据元素中第一个数据元素的位置编号 索引表结构图 查找步骤分两步进行 对索引表使用折半查找法 因为索引表是有序表 确定了待查关键字所在的子表后 在子表内采用顺序查找法 因为各子表内部是无序表 查找效率 ASL Lb Lw 对索引表查找的ASL 对块内查找的ASL S为每块内部的记录个数 n s即块的数目 例如当n 9 s 3时 ASLbs 3 5 而折半法为3 1 顺序法为5 假设索引表的长度为m 主表中每个子表的长度为s 并假设在索引表上和在主表上均采用顺序查找算法 则索引顺序表上查找算法的平均查找长度为 算法分析 完全索引表 和主表项完全相同 但只包含索引关键字和该数据元素在主表中位置信息的索引表二级索引表 当主表中的数据元素个数非常庞大时 按照建立索引表的同样方法对索引表再建立的索引表 二级以上的索引结构称作多级索引结构等长索引表 索引表中的每个索引项对应主表中的数据元素个数相等 反之称为不等长索引表 不等长索引表中的索引长度可随着动态插入和动态删除过程改变 因此不仅适用于静态查找问题 而且也适用于动态查找问题 相关术语 11 3动态查找表 动态查找表主要有二叉树结构和树结构两种类型 二叉树结构有二叉排序树 平衡二叉树等 树结构有B 树 B 树等 11 3 1二叉排序树和平衡二叉树 一 基本概念 二叉排序树或是一棵空树 或者是具有如下性质的非空二叉树 1 左子树的所有结点均小于根的值 2 右子树的所有结点均大于根的值 3 它的左右子树也分别为二叉排序树 下图所示就是一棵二叉排序树 根结点 左子树 右子树 二叉排序树中结点的结构体定义如下 typedefstructnode DataTypedata structnode leftChild structnode rightChild BiTreeNode 二 二叉排序树的查找算法 intSearch BiTreeNode root DataTypeitem BiTreeNode p if root NULL p root while p NULL if p data key item key return1 if item key p data key p p rightChild elsep p leftChild return0 思想 先在根结点中找 再根据待查关键字和根结点中关键字的大小 选在到左子树或右子树中去找 直到结点不存在 三 插入算法 插入操作要求首先查找数据元素是否在二叉排序树中存在 若存在则返回 若不存在 插入查找失败时结点的左指针或右指针上 所插新结点一定在叶结点上 思想 先查找如果找到 则还回标记成功标记 如0 如果没有找到 插入 插入就是将新建的结点作为当前结点的左孩子或右孩子 三 插入算法 root 查找item key 40 curr curr curr 三 插入算法 root 查找item key 33 curr curr curr curr curr 插入处 三 插入算法 root 查找item key 33 curr curr curr curr curr parent parent parent parent 33 p intInsert BiTreeNode root DataTypeitem BiTreeNode current parent NULL p current root while current NULL if current data key item key return0 parent current if current data keyrightChild elsecurrent current leftChild 生成新结点 p BiTreeNode malloc sizeof BiTreeNode p data item p leftChild NULL p rightChild NULL if parent NULL root p elseif item keydata key parent leftChild p elseparent rightChild p return1 下图是调用上述插入函数依次插入数据元素4 5 7 2 1 9 8 11 3的过程 五 删除算法 删除操作要求首先查找数据元素是否在二叉排序树中存在 若不存在则结束 存在的情况及相应的删除方法有如下四种 1 要删除结点无孩子结点 直接删除该结点 2 要删除结点只有左孩子结点 删除该结点且使被删除结点的双亲结点指向被删除结点的左孩子结点 3 要删除结点只有右孩子结点 删除该结点且使被删除结点的双亲结点指向被删除结点的右孩子结点 4 要删除结点有左右孩子结点 分如下三步完成 首先寻找数据元素的关键字值大于要删除结点数据元素关键字的最小值 即寻找要删除结点右子树的最左结点 然后把右子树的最左结点的数据元素值拷贝到要删除的结点上 最后删除右子树的最左结点 删除过程分别如图所示 30 重复删除操作 删除红色结点 例11 2设计一个测试二叉排序树的主函数 include include includetypedefintKeyType typedefstruct KeyTypekey DataType typedefstructnode DataTypedata structnode leftChild structnode rightChild BiTreeNode include BiSortTree h voidInTraverse BiTreeNode root 中序遍历显示二叉排序树结点信息函数 if root NULL return if root leftChild NULL InTraverse root leftChild printf d root data key if root rightChild NULL InTraverse root rightChild voidmain void DataTypetest 4 5 7 2 1 9 8 11 3 x 9 intn 9 i s BiTreeNode root NULL for i 0 i n i Insert 程序运行建立的二叉排序树如图11 5 i 所示 程序运行结果如下 1234578911数据元素9存在 六 二叉排序树的性能分析 一棵二叉排序树的平均查找长度为 其中 C i 为查找第i个数据元素时的关键字比较次数 当二叉排序树是一棵完全二叉树时 二叉排序树的平均查找长度为 当二叉排序树是一棵单分支退化树时 则平均查找长度就和有序顺序表的平均查找长度相同 即为 a 满二叉排序树时 k log2 7 1 3 所以查找成功的平均查找长度为 b 左分支退化二叉排序树时 k n 7 所以查找成功的平均查找长度为 在最坏情况下 二叉排序树的平均查找长度为O n 在一般情况下 二叉排序树的平均查找长度为O log2n 平衡二叉树或者是一棵空树 或者是具有这样性质的二叉排序树 它的左子树和右子树都是二叉排序树 并且左子树和右子树的深度之差的绝对值不超过1 基本方法 就是在构造二叉排序树的基础上 每当如果插入了一个新结点后 使二叉树中某个结点的左子树和右子树的深度之差的绝对值超过1 则调整相应的二叉树 使二叉树中该结点的左子树和右子树的深度之差的绝对值不超过1 特点 平衡二叉树一定不会出现单分支退化二叉排序树那样的情况 因此 平衡二叉树的平均查找长度为O lbn 但相对二叉排序树来说 构造平衡二叉树需要花费较多的时间 而且删除平衡二叉树中某个结点时 也要考虑删除某个结点后 平衡二叉树中某个结点的左子树和右子树的深度之差的绝对值不能超过1 七 平衡二叉树 1B 树 B 树是一种平衡多叉排序树 平衡是指所有叶结点都在同一层上 从而可避免出现像二叉排序树那样的分支退化现象 因此B 树的动态查找效率更高 B 树中所有结点的孩子结点个数的最大值称为B 树的阶 11 3 2B 树和B 树 1 树中每个结点至多有m个孩子结点 2 除根结点外 其他结点至少有 m 2 个孩子结点 符号 表示上取整 3 若根结点不是叶结点 则根结点至少有两个孩子结点 4 每个结点的结构为 5 所有叶结点都在同一层上 一棵m阶的B 树或者是一棵空树 或者是满足下列要求的m叉树 结点关键字个数 结点孩子指针 关键字的值 1 树中每个结点至多有m个孩子结点 2 除根结点外 其他结点至少有 m 2 个孩子结点 符号 表示上取整 3 若根结点不是叶结点 则根结点至少有两个孩子结点 4 每个结点的结构为 5 所有叶结点都在同一层上 一棵m阶的B 树或者是一棵空树 或者是满足下列要求的m叉树 一棵4阶B 树 2个孩子 3个孩子 4个孩子 B 树的查找算法 在B 树上查找数据元素x的方法为 将x key与根结点的Ki逐个进行比较 1 若x key Ki 则查找成功 2 若keyKn 则沿着指针Pn所指的子树继续查找 例子 查找key 30 curr curr curr 例子 查找key 32 curr curr curr curr 插入过程分两步完成 1 利用查找算法找出该关键字的插入结点 B 树的插入结点一定是叶结点 2 判断该结点是否还有空位置 即判断该结点是否满足n m 1 若该结点满足n m 1 说明该结点还有空位置 直接把关键字x key插入到该结点的合适位置上 若该结点有n m 1 说明该结点已没有空位置 要插入就要分裂该结点 B 树的插入算法 该结点分裂方法 先把待插入数据的关键字插入该结点的适当位置 以结点的中间关键字为界分为两个结点 把中间数据元素的关键字向上插入到双亲结点上 若双亲结点未满 则插入合适位置上 若双亲结点已满 则按同样的方法继续向上分裂 在3阶B 树上进行插入操作如下图示 插入90 n 1 m 3 未满 n m 1 在3阶B 树上进行插入操作 n 2 m 3 n m 1 插入195 已满 B 树的删除算法 删除分两步完成 1 利用查找算法找出该关键字所在的结点 2 在结点上删除关键字x key分两种情况 一种是在叶结点上删除关键字 共有以下三种情况 B 树的删除算法 删除分两步完成 1 利用查找算法找出该关键字所在的结点 2 在结点上删除关键字x key分两种情况 一种是在叶结点上删除关键字 共有以下三种情况 B 树的删除算法 删除分两步完成 1 利用查找算法找出该关键字所在的结点 2 在结点上删除关键字x key分两种情况 一种是在叶结点上删除关键字 共有以下三种情况 B 树的删除算法 删除分两步完成 1 利用查找算法找出该关键字所在的结点 2 在结点上删除关键字x key分两种情况 一种是在叶结点上删除关键字 共有以下三种情况 a 假如要删除关键字结点的关键字个数n大于 m 2 1 说明删去该关键字后该结点仍满足B 树的定义 则可直接删去该关键字 其过程如下图 b 所示 n 2 m 3 n m 2 1 删去该关键字后该结点仍满足B 树的定义 删除110 b 假如要删除关键字结点的关键字个数n等于 m 2 1 说明删去该关键字后该结点将不满足B 树的定义 此时若该结点的左 或右 兄弟结点中关键字个数n大于 m 2 1 则把该结点的左 或右 兄弟结点中最大 或最小 的关键字上移到双亲结点中 同时把双亲结点中大于 或小于 上移关键字的关键字下移到要删除关键字的结点中 这样删去关键字后该结点以及它的左 或右 兄弟结点都仍旧满足B 树的定义 其过程如图 c 所示 删除80 n 1 m 3 n m 2 1 删去该关键字后该结点不满足B 树的定义 c 假如要删除关键字结点的关键字个数n等于 m 2 1 并且该结点的左和右兄弟结点 如果存在的话 中关键字个数n均等于 m 2 1 这时需把要删除关键字的结点与其左 或右 兄弟结点以及双亲结点中分割二者的关键字合并成一个结点 其过程如图 d 所示 删除关键字的结点 选一个兄弟结点 找分割两者的双亲结点的关键字 删除116 n 1 m 3 n m 2 1 另一种是在非叶结点上删除关键字 在非叶结点上删除关键字时 假设要删除关键字Ki 1 i n 以该结点Pi所指子树中寻找的最小关键字Kmin 用Kmin代替被删关键字Ki所在的位置 然后再以指针Pi所指结点为根结点查找并删除Kmin 其过程如图 e 所示 Pi所指子树中的最小关键字Kmin一定是在叶结点上 在非叶结点上删除问题就转化成了叶结点上的删除问题 189 最后利用删除叶结点数据的方法删除189 练习题 对3阶B 树 要求完成下列问题 1 设要插入的数据序列为 11 33 21 44 55 79 88 给出建立该3阶B 树的示意图过程 2 在第1步建好的3阶B 树上 给出删除关键字79的示意图过程 给出适当的说明 3 在第1步建好的3阶B 树上 给出删除关键字55的示意图过程 给出适当的说明 4 在第1步建好的3阶B 树上 给出删除关键字58的示意图过程 给出适当的说明 3 在第1步建好的3阶B 树上 给出删除关键字33的示意图过程 给出适当的说明 11 1133 112133 11 33 21 11 21 3344 11 21 334455 33 2144 11 55 33 2144 11 5558 33 2144 11 555879 33 11 214458 79 55 11 33 21 55 79 58 44 11 33 21 55 7988 58 44 插入11 插入33 插入21 插入44 插入55 插入58 插入79 插入88 11 33 21 55 7988 58 44 删除79前 11 33 21 55 88 58 44 删除79后 11 33 21 55 7988 58 44 删除55前 11 33 21 55 88 5879 44 删除55后 11 33 21 58 88 79 44 11 33 21 55 7988 58 44 删除58前 11 33 21 55 7988 79 44 删除58后 11 33 21 55 88 79 44 11 33 21 55 7988 58 44 删除33前 删除33后 1121 55 7988 58 44 1121 55 7988 4458 2B 树的定义 B 树是B 树的一种变型 和B 树主要用于动态查找问题的应用范围不同 B 树主要用于文件系统 一棵m阶B 和一棵m阶B 树的主要差异在于 1 在B 树中 有n棵子树的结点中有n 1个关键字 而在B 树中 有n棵子树的结点中有n个关键字 2 B 树比B 树多一层叶子结点 B 树在这层增加的叶子结点中包含了每个数据元素的所有信息 并且所有叶子结点从左到右依次链接 这样刚好构成一个每个叶子结点包含若干个有序关键字的有序单链表 3 在B 树中 每个非叶子结点中的关键字满足大于相临左指针所指子树中所有结点的关键字值 小于相临右指针所指子树中所有结点的关键字值 而在B 树中 每个非叶子结点中的一个关键字和一个指针对应 这些关键字和对应的指针满足该关键字是对应指针所指子树中所有关键字的最大值 a 3阶B 树 b 3阶B 树 11 4哈希表 哈希函数 数据元素的关键字和该数据元素的存放位置之间的映射函数哈希表 通过哈希函数来确定数据元素存放位置的一种特殊表结构 Why 静态查找 动态查找 无法从数据元素的关键字获得数据的相应存储位置 缺陷 1 哈希表的基本概念 构造方法 设要存储的数据元素个数为n 设置一个长度为m m n 的连续内存单元 分别以每个数据元素的关键字Ki 0 i n 1 为自变量 通过哈希函数h Ki 把Ki映射为内存单元的某个地址h Ki 并把该数据元素存储在这个内存单元中 哈希函数h Ki 实际上是关键字Ki到内存单元的映射 因此 h Ki 也称为哈希地址 哈希表也称作散列表 0 1 2 3 m 1 n个数据元素 m个连续内存单元 h k1 h k2 h k3 h k4 h kn 哈希表 k1 k2 k3 k4 kn 构造哈希表时出现Ki Kj i j 但h Ki h Kj 的现象称作哈希冲突 这种具有不同关键字而具有相同哈希地址的数据元素称作 同义词 由同义词引起的冲突称作同义词冲突 解决哈希冲突的基本思想是 通过哈希冲突函数 设为hl K l 1 2 m 1 产生一个新的哈希地址使hl Ki hl Kj 把要存储的n个数据元素通过哈希函数映射到了m个连续内存单元中 从而完成了哈希表的构造 可见 构造哈希表一定要使用主关键字 不能使用次关键字 为什么 哈希冲突 例11 1建立数据元素集合a的哈希表 a 180 750 600 430 541 900 460 并比较m取值不同时的哈希冲突情况 分析 数据元素集合a中共有7个数据元素 数据元素的关键字为三位整数 如果我们取内存单元个数m为1000 即内存单元区间为000 999 则第一 在m个内存单元中可以存放下n个数据元素 第二 若取h K K 则当Ki Kj i j 时一定有h Ki h Kj 但是 在1000个内存单元中只存储7个数据元素其空间存储效率太低 为了提高存储效率 做如下改进 取内存单元个数m为13 取哈希函数h K 为 h K Kmodm 则有 h 180 11h 750 9h 600 2h 430 1h 541 8h 900 3h 460 5 a 180 750 600 430 541 900 460 若取内存单元个数m为11 仍取哈希函数h K 为 h K Kmodm 则有 h 180 4h 750 2h 600 6h 430 1h 541 3h 900 9h 460 9此时h 460 h 900 9 因此存在哈希冲突 若取第一次哈希冲突函数h1 K 为哈希地址加1后模m 即 h1 K h K 1 modm K 1 modm 则有 h1 460 10 线性探查法 a 180 750 600 430 541 900 460 引起哈希冲突的原因 1 与装填因子有关 装填因子是指哈希表中已存入的数据元素个数 与哈希地址空间大小 的比值 即 越小 冲突的可能性就越小 但哈希表中空闲单元的比例就越大 越大 最大可取1 时 冲突的可能性就越大 但哈希表中空闲单元的比例就越小 存储空间的利用率就越高 2 与所采用的哈希函数有关 3 与解决哈希冲突的哈希冲突函数有关 2 哈希函数的构造方法 常用的哈希函数构造方法有 1 除留余数法2 直接定址法3 数字分析法 函数设计目标 使通过哈希函数得到的n个数据元素的哈希地址尽可能均匀地分布在m个连续内存单元上 同时使计算过程尽可能简单 以达到尽可能高的时间效率 h K Kmodm优点 计算简单 适用范围广关键 选好哈希表长度m技巧 哈希表长m取素数时效果较好 0 6 0 8 一 除留余数法 二 直接定址法 h K K C优点 计算简单 不会发生冲突缺点 有可能造成内存单元的大量浪费 特点 取数据元素关键字中某些取值较均匀的数字位作为哈希地址 只适合于所有关键字值已知的情况 三 数字分析法 3 哈希冲突解决方法 常见的冲突处理方法有 一 开放定址法二 链表法 一 开放定址法 开放定址法 以发生哈希冲突的哈希地址为自变量 通过某种哈希冲突函数得到一个新的空闲的内存单元地址 哈希冲突 关键字k1 关键字k2 哈希地址v 哈希地址v h h 地址d h1 关键字k3 地址d h 同义词冲突 非同义词冲突 h1 地址d 一 开放定址法 常用方法 1 线性探查法 优点 只要哈希表未被填满 保证能找到一个空地址单元存放有冲突的元素 缺点 容易产生 堆积 大大降低了查找效率 已经被前面的关键字填充 依次探测下一个地址 2 平方探查法 3 伪随机数法 平方探查法的探查跨步很大 所以可避免出现堆积问题 伪随机数法的探查跨步是随机的 所以可避免出现堆积问题 二 链表法 基本思想 如果没有发生哈希冲突 则直接存放该数据元素 如果发生了哈希冲突 则把发生哈希冲突的数据元素另外存放在单链表中 方法有两种 第一种方法是为发生哈希冲突的不同的同义词建立不同的单链表 第二种方法是为发生哈希冲突的所有同义词建立一个单链表 例11 2建立数据元素集合a的哈希表 a 16 74 60 43 54 90 46 31 29 88 77 66 55 要求哈希函数采用除留余数法 解决冲突方法采用链表法 设计分析 数据元素集合a中共有13个数据元素 取哈希表的内存单元个数m 13 除留余数法的哈希函数为 h K Kmodm有 h 16 3h 74 9h 60 8h 43 4h 54 2h 90 12h 46 7h 31 5h 29 3h 88 10h 77 12h 66 1h 55 3 采用链表法的第一种方法建立的哈希表存储结构如下图所示 练习 已知一组关键字 32 40 36 53 16 46 71 27 42 24 49 64 散列表长度为13 散列函数为 H key keymod13 则用链地址法处理冲突 4哈希表设计 例11 3编写一组包括哈希表初始化 哈希表元素插入 哈希表元素删除 哈希表查找和哈希表空间撤消操作的函数 要求哈希函数采用除留余数法 解决哈希冲突方法采用开放定址法的线性探查法 并设计一个测试程序进行测试 0 1 2 3 m 1 h k1 h k2 h k3 h k4 h kn 哈希表 确定最大元素个数 存储首地址 数据元素 数据 状态 实际数据个数 结构变量 EmptyActiveDeleted 枚举类型 4哈希表设计 设计 数据结构设计 结构体HashTable由哈希表数组 数组个数和当前表项个数三部分组成 哈希表数组中每个表项的数据类型是结构体HashItem 结构体HashItem由数据元素和表项状态两部分组成 其中数据元素仅包括一个关键字域 表项状态的数据类型为枚举类型 表项状态域有Empty Active和Deleted三种状态 分别表示表项的空 已占用和被删除三种状态 typedefenum Empty Active Deleted KindOfItem typedefstruct KeyTypekey DataType typedefstruct DataTypedata KindOfIteminfo HashItem typedefstruct HashItem ht inttableSize intcurrentSize HashTable intInitiate HashTable hash intmSize hash tableSize mSize hash ht HashItem malloc sizeof HashItem mSize if hash ht NULL return0 else hash currentSize 0 return1 0 1 2 3 m 1 哈希表 哈希表的初始化 分配初始空间 哈希表查找 0 1 2 3 m 1 h k1 h k2 h k3 h k4 h kn 哈希表 查找数据x 正常存放在内存h x key x key m中 内存存放的数据的key与x的key是不是相等 intFind HashTable hash DataTypex inti x key hash tableSize intj i while hash ht j info Active intInsert HashTable hash DataTypex inti Find hash x if i 0 数据元素已经存在return0 elseif i hash tableSize 数据不存在且表未满 hash ht i data x hash ht i info Active hash currentSize return1 elsereturn0 intDelete HashTable hash DataTypex inti Find hash x if i 0 找到 hash ht i info Deleted 置删除标记hash currentSize return1 elsereturn0 voidDestroy HashTable hash free hash ht 三 测试程序例11 3测试程序设计 建立数据元素集合a 180 750 600 430 541 900 460 的哈希表 并分别测试哈希表长度m 13和m 11两种情况得到的哈希表 练习题 填空题 填空题 1 采用二分法进行查找的查找表 应选择 方式的存储结构 2 在各种查找法中 平均查找长度与结点个数n无关的查找方法是 3 在分块查找法中 首先查找 然后再查找相应的 4 假设在有序表A 0 19 中进行二分查找 比较一次查找成功的结点数为 比较二次查找成功的结点数为 比较三次查找成功的结点数为 比较四次查找成功的结点数为 比较五次查找成功的结点数为 平均查找长度为 5 查找有序表R 0 11 中每个数据元素 假设查找在等概率情况下进行 则进行顺序查找的平均查找长度为 进行二分查找的平均查找长度为 6 假设在线性表R 0 59 中进行分块查找 共分10块 每块长度为6 若利用顺序查找法对索引表和子块进行查找 则查找每个元素的平均查找长度为 7 在散列存储中 装填因子的值越大 存取数据元素时发生冲突的可能性就 装填因子的值越小 存取数据元素时发生冲突的可能性就 8 在一个10阶B 树中 每个根结点所含关键字的数目最多允许为 最少允许为 9 一棵深度为h的B 树上 任一个叶子结点所处的层数为 当向该B 树插入一个新结点时 为了检索插入位置需读取 个结点 10 当向B 树中插入关键字时 可能引起结点 最终可能导致该B 树的高度 当从B 树中删除关键字时 可能引起结点 最终可能导致该B 树的高度 2 选择题 1 采用顺序查找法检索长度为n的线性表 则检索每个元素的平均比较次数为 A nB n 2C n 1 2D n 1 2 2 适于对动态查找表进行高效率查找的组织结构是 A 有序表B 分块有序表C 二叉排序树D 线性链表 3 对线性表进行二分查找时 要求线性表必须 A 键值有序的链接表B 键值有序的顺序表C 链接表但键值不一定有序D 顺序表但键值不一定有序 5 有一个有序表 1 4 6 10 18 35 42 53 67 71 78 84 92 99 当用二分查找法查找键值为84的结点时 经 比较后查找成功 A 2B 3C 4D 12 6 顺序检索一个具有n个数据元素的线性表 其时间复杂度为 二分检索一个具有n个数据元素的线性表 其时间复杂度为 A O n B O log2n C O n2 D O nlog2n 7 在一棵3阶B 树上 每个结点包括的子树相同 最多为 最少为 A 1B 2C 3D 4 8 设散列表长度为m 散列函数为H key key p 为了减少发生冲突的可能性 p应取 A 小于m的最大奇数B 小于m的最大素数C 小于m的最大偶数D 小于m的最大合数 解答题 1 给定表 19 14 22 01 66 21 83 27 56 13 10 试按元素在表中的顺序构造一棵二叉排序树 判断该二叉排序树是否平衡 若不平衡 调整其为平衡二叉树 已知一个长度为12的表 Jan Feb Mar Apr May June July Aug Sep Ocr Nov Dec 试按表中元素的次序依次插入一棵初始状态为空的二叉排序树 以字符ASCII大小为序 画出相应的二叉排序树 并求出等概率情况下的查找成功的平均查找长度 若根据该二叉排序树对表中元素排序构成有序表 试求在等概率情况下查找成功的平均查找长度 按表中元素顺序构造出一棵平衡二叉树 并求出等概率情况下查找成功的平均查找长度 3 现有线性表的关键字集合 33 41 20 24 30 13 01 67 共8个数据元素 已知散列函数为H k 3k 11 用开放定址法解决冲突 且d1 H k di di 1 7k 10 1 11 i 2 3 试在0 10的散列地址空间中构造散列表 并计算出等概率情况下查找成功和查找失败的平均查找长度 采用链地址法解决地址冲突 构造哈希表 并求出等概率情况下查找成功的平均查找长度 H 33 3 33 11 0 H 33 3 33 11 0 H 33 3 33 11 0 H 33 3 33 11 0H 41 3 41 11 2 H 33 3 33 11 0H 41 3 41 11 2 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3H 13 3 13 11 6 冲突 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3H 13 3 13 11 6 冲突d1 3 13 11 6 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3H 13 3 13 11 6 冲突d1 3 13 11 6d2 d1 7 13 10 1 11 8 H 33 3 33 11 0H 41 3 41 11 2H 20 3 20 11 5H 24 3 24 11 6H 30 3 30 11 2 冲突d1 3 30 11 2d2 d1 7 30 10 1 11 3H 13 3 13 11 6 冲突d1 3 13 11 6d2 d1 7 13 10 1 11 8 H

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论