【考研计算机专业课】武汉大学数据结构PPT课件 第9章 查找

合集下载

数据结构部分(查找)课件

数据结构部分(查找)课件

n=0
n=1
n=2
空树
最大深度为 0 最大深度为 1 最大深度为 2
n=4
n=7
最大深度为 3
最大深度为 4
三、 B - 树
1.定义
2.查找过程
1.B-树的定义
B-树是一种 平衡 的 多路 查找 树:
root 50
15
71 84
38
20 26 43
56 62 78 89 96
在 m 阶的B-树上,每个非终端结点可能 含有:
low 指示查找区间的下界; high 指示查找区间的上界; mid = (low+high)/2。
分析折半查找的平均查找长度
先看一个具体的情况,假设:n=11
i 1 2 3 4 5 6 7 8 9 10 11 Ci 3 4 2 3 4 1 3 4 2 3 4
判定树
3
6 9
1
4
7
10
2
5
8
11
一般情况下,表长为 n 的折半查找 的判定树的深度和含有 n 个结点的完全 二叉树的深度相同。
何谓查找表 ?
查找表是由同一类型的数据元素( 或记录)构成的集合。
由于“集合”中的数据元素之间存在着 松散的关系,因此查找表是一种应用灵 便的结构。
对查找表经常进行的操作:
• 1)查询某个“特定的”数据元素是否 在查找表中;
• 2)检索某个“特定的”数据元素的各 种属性;
• 3)在查找表中插入一个数据元素; • 4)从查找表中删去某个数据元素。
• 根据动态查找表的定义,“插入”操 作在查找不成功时才进行;
• 若二叉排序树为空树,则新插入的 结点为新的根结点;否则,新插入 的结点必为一个新的叶子结点,其 插入位置由查找过程得到。

数据结构课件--第九章.ppt

数据结构课件--第九章.ppt
返回主目录
}
算法分析:
采用折半插入排序法,可减少关键字的比较次
数。每插入一个元素,需要比较的次数最大为折半
判定树的深度,如插入第i个元素时,设i=2j,则需进
行log2i次比较,因此插入n-1个元素的平均关键字的 比较次数为O(nlog2n)。
虽然折半插入排序法与直接插入排序法相比较,
改善了算法中比较次数的数量级,但其并未改变移
法 {r[j+1]= r[j]; j=j-1;}
r[j+1]=r[0];
/*将待插入记录插入到已排序的序列中*/
}
} /* InsSort */
返回主目录
该算法的要点是:①使用监视哨r[0]临时保存待插入的记录。 ②从后往前查找应插入的位置。③查找与移动用同一循环完 成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。 从时间耗费角度来看,主要时间耗费在关键字比较和移动元 素上。
字的领先关系在排序过程中发生变化者,则称所用
的排序方法是不稳定的。
返回主目录
在排序过程中,一般进行两种基本操作: (1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。 对于第二种操作,需要采用适当地存储方式,即向 量结构、链表结构以及记录向量与地址向量结合的 表示方法。
我们重点来讨论在向量存储结构上各种排序方法的 实现。
返回主目录
9.2 插入类排序
基本思想:在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序插入到已排好序的记录子集中,直
到将所有待排记录全部插入为止。
9.2.1 直接插入排序
基本操作是将第i个记录插入到前面i-1个已排好序的记录中, 具体过程为:将第i个记录的关键字Ki顺次与其前面记录的 关键字Ki-1,Ki-2,…K1进行比较,将所有关键字大于Ki的 记录依次向后移动一个位置,直到遇见一个关键字小于或者 等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插 入空位置即可。

大学数据结构课件--第9章 查找

大学数据结构课件--第9章 查找
——这种既查找又插入的过程称为动态查找。
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p

数据结构第九章查找PPT培训课件

数据结构第九章查找PPT培训课件
进行比较。 如果找到一个记录,有:
k=elem [i].key, (0≤i≤n),则停止比较。
如果 i>0,则查找成功;否则,查找失败。
输入:查找表ST,查找条件(关键字)k
输出:成功时:记录序号,失败时:0
int sequsearch(SSTable ST,keytype k)
{
int i=ST.length; //从第n个记录开始查找
折半查找算法2
int binsrch(SSTable ST,keytype k) {int low,mid,hig;
low=1; hig=ST.length;
while (low<=high)
{ mid=(low+high)/2;
if (k<ST.elem [mid].key) hig=mid-1;//查左子表
break;
//查找成功,退出循环
else low=mid+1; //查右子表

if (ST.elem[mid].key==k)
{ printf("success\n”); return mid;
} else
{ printf("fail\n”); return 0;
} }
//查找成功 //查找失败
n=15,满二叉树
2 5 8 10 12
n=12,非满二叉树
➢结点内的数据表示数据元素的序号(如例中表示有15个元素组成 的有序表的判定树)
➢根结点表示首先要和关键字k进行比较的数据元素的序号(如8), 比较相等时,查找成功,否则,当k小于根结点对应元素的关键字 时,下步就和左子结点(如序号4)对应元素的关键字比较,否则, 下步就和右子结点(如序号12)对应元素的关键字比较。

数据结构查找ppt课件

数据结构查找ppt课件

low mid
high=mid-1
( 08, 14, 23, 37, 46, 55, 68, 79,
high
91 )
91 )
low=mid+1
high
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
low
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
➢ 查找算法中的基本运算是记录的关键字与给定值所进行的 比较,其执行时间通常取决于比较的次数。因此,通常以 关键字与给定值进行比较的记录个数的平均值,作为衡量 查找算法好坏的依据。
12.05.2021
4
整理版课件
查找表操作及分类
➢ 操作:
(1)查询某个“特定的”数据元素是否在查找表中;
(2)某个“特定的”数据元素的各种属性;
➢ 顺序查找的存储结构要求:
顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链 式存储结构(使用单链表作为存储结构时,扫描必须从第一个结点开始), 顺序查找对数据在表中存放的先后次序没有任何要求。
12.05.2021
7
整理版课件
➢ 顺序查找的线性表定义如下:
typedef struct { ElemType *elem; int length;
哨的 作用: 无需 判断 是否 越界.
9
顺序查找的算法:
使用了监视哨,在查
int Search_seq(SSTable ST[ ], { int i=n;
int n,
int
key找步) f{o过都r(i程去=n;中判i>断,0; -是不-i)否用
每 查
一 找
结束if(。ST0.e单lem元[ i被].k当ey=作ke监y)

数据结构九章节查找

数据结构九章节查找

9.3 动态查找表
二叉排序树中序遍历 中序遍历二叉排序树,可得到一个关键字的有序序列,如 5,13,19,21,37,56,64,92,75,80,88
56 13
5
37
64 92
21
80
19
75
88
中国科大《数据结构》
9-25
9.3 动态查找表
二叉排序树删除 删除二叉排序树中的一个结点后,必须保持二叉排序树的特性:
顺序查找算法 1. 从表中最后一个记录开始 2. 逐个进行记录的关键字和给定值的比较 3. 若某个记录比较相等,则查找成功 4. 若直到第1个记录都比较不等,则查找不成功
9-6
中国科大《数据结构》
9.2 静态查找表
顺序查找算法描述
int Search_Seq(SSTable ST, KeyType key) { // 若查找成功,返回位置
中国科大《数据结构》
9-19
9.3 动态查找表
动态查找表 如果应用问题涉及的数据量很大,而且数据经常发生变化,如
图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对 这类表除了提供前面的介绍的查找外,还要提供动态查找功能: 1. 查找某个“特定”元素是否在表中,若不在,将该元素插入; 2. 查找某个“特定”元素是否在表中,若在,从表中删除; 如何组织动态查找表? 用静态查找方法不能满足要求了。本节介绍几种方法。
找到 21
64
92 无此数
80
19
75
88
找到
例1:在右图二叉排序树中查找关键字值等于37 例2:在右图二叉排序树中查找关键字值等于88 例3:在右图二叉排序树中查找关键字值等于94
中国科大《数据结构》

数据结构---第九章.

数据结构---第九章.

b b+L b+(m-1)L
^ fire seeks ^
数据结构---第九章 查找 19
to ^
int SeqSearch(Seqlist R, KeyType K) { R[0].key=K; for (i=n; R[i]!=K; i--); return(i); }//SeqSearch
数据结构---第九0],提高算法效率。 [性能分析] • 空间复杂度:一个辅助空间。 • 时间复杂度: 1) 查找成功时的平均查找长度 设表中各记录查找概率相等
8.1.2 有序表的查找 满足 R[i].key R[i+1].key, 1 i <n [折半(对半/二分)查找法] 0 1 2 3 4 5 6
7
8
9
10 11
05 13 19 21 37 56 64 75 80 88 92 low mid high =(low+high)/2
K=21 l 1 1 4 h 11 5 5 m 6 3 4 K=85 l 1 7 10 10 h m 11 6 11 9 11 10 9
数据结构---第九章 查找
b+(m-1)L
16
8.3.2 哈希函数的基本构造方法 构造原则: 算法简单,运算量小;
均匀分布,减少冲突。
[直接定址法] H(key)=a key + b 特点:计算简单,冲突最少。 [数字分析法] 取关键字的若干数位作为哈希地址。 例:8 1 3 4 6 5 3 2 (共70个记录,则取随机性好的两位) [平方取中法] 取关键字平方后的中间几位作为哈希地址。
p=97
[随机数法]
H(key) = random(key) 特点:较适于关键字长度不等时的情况。

数据结构 第9章 查找4-哈希表

数据结构 第9章 查找4-哈希表

7、随机数法 Hash(key) = random ( key ) (random为伪随机函数)
适用于:关键字长度不等的情况。造表和查找都很方便。
小结:构造哈希函数的原则:
① ② ③ ④ ⑤ 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。
三、冲突处理方法
14 H(14)=14%7=0
6个元素用7个 地址应该足够!
1
2
23 9
3
4
39 25 11
5
6
H(25)=25%7=4 H(11)=11%7=4
有冲突!
在哈希查找方法中,冲突是不可能避免的,只能 尽可能减少。
所以,哈希方法必须解决以下两个问题:
1)构造好的哈希函数
(a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中 大致均匀分布,以减少空间浪费。
讨论:如何进行散列查找?
根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。
缺点:空间效率低!
若干术语
哈希方法 (杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置, 并按此存放;查找时,由同一个函数对给定值k计算地址, 将k与地址单元中元素关键码进行比较,确定查找是否成 功。
3. 乘余取整法
4. 数字分析法
5. 平方取中法
常用的哈希函数构造方法有:
6. 折叠法
7. 随机数法
1、直接定址法
(a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址, 不会产生冲突. 缺点:要占用连续地址空间,空间效率低。

Java数据结构 查找 武汉大学PPT学习教案

Java数据结构 查找 武汉大学PPT学习教案
第6页/共22页
第四节 折半查找法
4 .折半查找法
【例9.4】若将【例9.3】中的数据排成一个有序序列,即A= {6,9,12,25,32, 55,73,76,95,124},查找给定的某个数字X是否存在,并给出相应提示。
第7页/共22页
4.2算法描述 折半查找的思想:首先将查找序列分成两半,确定查找数可能在哪一半,
a0 a1 a2 a3
a4
a5 a6 a7 a8 a9
6 9 12 25
32
55 73 76 95 124
i
m=「(i+j)/2」
j
情况1:将X=95和am=32比较,结果为X>am,数值X可能在右侧
情况2:将X=13和am=32比较,结果为X<am,数值X可能在左侧
第9页/共22页
(2)调整i或j的位置,使m为新中间元素的下标,使原序列折半,继 续查找相应元素,如图9.3(b)所示。
根据散列地址,实现元素的存储映象H[m]:
第17页/共22页
冲突:在实际应用中,通常可能出现一个待插入元素的散列地址 单元已被占用情况,使得该元素无法直接存入此单元,这种情况 称为冲突。
同义词:具有不同关键字而具有相同散列地址的元素称为同义词, 即key1≠key2,但h(key1)=h(key2)。由同义词引起的冲突称作同义词 冲突。
第2页/共22页
3.2 算法描述
这是一个典型的查找问题,可将序列表A用数组表示, 用数值X和系列A中的每个元素进行比较,若相等,则表 示X在序列表A中存在,则查找成功,否则失败。如图9.2 所示。
a0
a1 a2 a3 a4 a5 a6 a7 a8 a9
55
25 6 95 76 12 124 32 9 73
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

子表2
若k<x.key,只需在子表1中查找;
若k>x.key,只需在子表2中查找;
例 如 , 在 关 键 字 有 序 序 列 {2,4,7,9,10,14,18,26,32,40}中采用二分查找 法查找关键字为7的元素。
二分查找过程如下:
开始: 40
0
2
1
2
4
3
7
4
9
5
10
6
7
14
8
18
high=9
i=6
查找成功,返回序号6
顺序查找的算法如下(在顺序表R[0..n-1]中查找关键 字为 k 的记录 , 成功时返回找到的记录位臵 , 失败时返回 1):
int SeqSearch(SeqList R,int n,KeyType k)
{ int i=0; while (i<n && R[i].key!=k) i++; //从表头往后找 if (i>=n) return -1; else return i; }
i=1
第3次比较: 3 9 1 5 8 10 6 7 2 4
i=2
第4次比较: 3 9 1 5 8 10 6 7 2 4
i=3
第5次比较: 3 9 1 5 8 10 6 7 2 4
i=4
第6次比较: 3 9 1 5 8 10 6 7 2 4
i=5
第7次比较: 3 9 1 5 8 10 6 7 2 4
查找算法
采用何种查找方法?
数据组织方式 数据是否有序
( 1 )使用哪种数据结构来表示“表”,即 表中记录是按何种方式组织的。
( 2 )表中关键字的次序。是对无序集合查 找还是对有序集合查找?
若在查找的同时对表做修改运算(如插入 和删除),则相应的表称之为动态查找表;否 则称之为静态查找表。
由于查找运算的主要运算是关键字的比较,所以通常把查找 过程中对关键字需要执行的平均比较次数(也称为平均查找长度) 作为衡量一个查找算法效率优劣的标准。平均查找长度 ASL
思考题 采用二分查找的数据适合采用什么存储结构。
其算法如下(在有序表R[0..n-1]中进行二分查找,成功时返回记录 的位臵,失败时返回-1):
int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid; while (low<=high) { mid=(low+high)/2; if (R[mid].key==k) //查找成功返回 return mid; if (R[mid].key>k) //继续在R[low..mid-1]查找 high=mid-1; else low=mid+1; //继续在R[mid+1..high]中查找 } return -1; }
第9章 查找
9.1 查找的基本概念 9.2 线性表的查找 9.3 树表的查找 9.4 哈希表查找
9.1 查找的基本概念
被查找的对象是由一组记录组成的表或文件 ,而每
个记录则由若干个数据项组成 , 并假设每个记录都有
一个能唯一标识该记录的关键字。
在这种条件下 , 查找的定义是:给定一个值 k, 在含有 n 个记 录的表中找出关键字等于 k 的记录。若找到 ,则查找成功 , 返回 该记录的信息或该记录在表中的位臵;否则查找失败 , 返回相 关的指示信息。
从顺序查找过程可以看到(不考虑越界比较i<n),ci取 决于所查记录在表中的位臵。如查找表中第1个记录R[0]时, 仅需比较一次;而查找表中最后一个记录R[n-1]时,需比较 n次,即ci=i。因此,成功时的顺序查找的平均查找长度为:
1 n 1 n(n 1) n 1 ASL p c i sq i 1 i i n i 1 n 2 2
9
26
32
low=0 第1次比较: 2
0
mid=(0+9)/2=4 4
1
7
2
9
3
10
4
14
40
9
low=0 mid=(0+3)/2=1 high=3
第2次比较: 2
0
4
1
7
2
9
3
10
4
14
5
18
6
26
7
32
8
40
9
low=2 mid=(2+3)/2=2 high=3 查找成功,返回序号2
(1)顺序查找 (2)二分查找 (3)分块查找 因为不考虑在查找的同时对表做修改,故上述三种查找操作 都是在静态查找表上实现的。
查找与数据的存储结构有关,线性表有顺序和链式两种存储
结构。本节只介绍以顺序表作为存储结构时实现的顺序查找算 法。定义被查找的顺序表类型定义如下:
#define MAXL <表中最多记录个数>
typedef struct { KeyType key; //KeyType为关键字的数据类型
InfoType data;
} NodeType;
//其他数据
typedef NodeType SeqList[MAXL]; //顺序表类型
9.2.1 顺序查找
顺序查找是一种最简单的查找方法。
思路:从表的一端开始,顺序扫描线性表,依次将扫描到的 关键字和给定值k相比较,若当前扫描到的关键字与k相等,则 查找成功;若扫描结束后,仍未找到关键字等于 k 的记录,则
n
查找成功时的平均比较次数约为表长的一半 。 思考题:不成功时的平均查找长度是多少?
9.2.2 二分查找
二分查找也称为折半查找,要求线性表中的结点 必须己按关键字值的递增或递减顺序排列。
思路:首先用要查找的关键字 k 与中间位臵的结点的关键 字相比较,这个中间结点把线性表分成了两个子表,若比较结 果相等则查找完成;若不相等,再根据k与该中间结点关键字的 比较大小确定下一步查找哪个子表,这样递归进行下去,直到 找到满足条件的结点或者该线性表中没有这样的结点。 子表1 若k=x.key,找到了; x
(Average Search Length)定义为:
ASL p i c i
i 1
n
其中,n是查找表中记录的个数。pi是查找第i个记录的概率。一 般地,均认为每个记录的查找概率相等,即pi=1/n(1≤i≤n),ci是 找到第i个记录所需进行的比较次数。
9.2 线性表的查找
在表的组织方式中 , 线性表是最简单的一种。三种 在线性表上进行查找的方法:
查找失败。
例 如 , 在 关 键 字 序 列 为 {3,9,1,5,8,10,6,7,2,4}的线性表查找关键
字为6的元素。
顺序查找过程如下:
从前向后查找 开始: 3 9 1 5 8 10 6 7 2 4
第1次比较: 3 9 1 5 8 10 6 7 2 4
i=0
第2次比较: 3 9 1 5 8 10 6 7 2 4
相关文档
最新文档