c语言数据结构查找算法大全.ppt
合集下载
《数据结构与算法C》PPT课件_OK
• 空表:表内无元素(长度为0)的表称为空表。 • 表头:称Ls的第1个元素为Ls的表头。 • 表尾:称Ls中除去表头后其余元素构成的表为表尾。
显然,表尾一定是表,但表头不一定。
• 递归表: 若表Ls中某成员含有自己(即Ls),则称Ls为递归 表。
5
• 深度:Ls的深度Depth(Ls)递归地定义为:
• 元素共享性:在同一广义表中,任一元素(单元素或 表)均可以出现多次,同一元素的多次出现都代表的是 同一个目标,可以认为它们是共享同一目标。对多次出 现的元素,显然可以从不同的位置(路径)访问它们, 因此,具有该特性的表也称再入表(Reentrant List)。
13
§8.1.5 基本操作
广义表兼有线性表和树的 特性,因此,它的基本操 作也兼有线性表和树的一 些操作,此外,还有一些 特有操作,如求表头和表 尾。 求表头和表尾是广义表的 重要操作,通过它们,可 以按递归方法处理广义表, 也可实现一般访问。著名 的人工智能语言LISP和 Prolog其实就是以广义表为 数据结构,通过求表头和 表尾实现对象的操作。
8
错误!未找到引用源。给出了广义表图的一个例子。
显然,广义表图中画出了广义表的所有结点。图中结点
之间的边表示“包含/属于”关系,即若结点A到B有边, 则表示B是A的子表之一(A包含B)。
广义表图与树相似,只是
L
由于存在共享元素,使得
广义表图中某些结点
A
C
DE
的“父亲”不唯一。
B
c de
ab
图 8-0 广义表L(见下式) 的逻辑图L(A(B(a,b)), C(B(a,b), c), D(c,d,e), E(e) )
12
• 元素分层性:如果将广义表中不同出现的元素看作不 同的元素,则广义表是层次结构,即对任一元素,它只 直属层号比它大1的元素。不过,广义表的层次性与树 不同,在树中,任一元素只直属一个元素。
显然,表尾一定是表,但表头不一定。
• 递归表: 若表Ls中某成员含有自己(即Ls),则称Ls为递归 表。
5
• 深度:Ls的深度Depth(Ls)递归地定义为:
• 元素共享性:在同一广义表中,任一元素(单元素或 表)均可以出现多次,同一元素的多次出现都代表的是 同一个目标,可以认为它们是共享同一目标。对多次出 现的元素,显然可以从不同的位置(路径)访问它们, 因此,具有该特性的表也称再入表(Reentrant List)。
13
§8.1.5 基本操作
广义表兼有线性表和树的 特性,因此,它的基本操 作也兼有线性表和树的一 些操作,此外,还有一些 特有操作,如求表头和表 尾。 求表头和表尾是广义表的 重要操作,通过它们,可 以按递归方法处理广义表, 也可实现一般访问。著名 的人工智能语言LISP和 Prolog其实就是以广义表为 数据结构,通过求表头和 表尾实现对象的操作。
8
错误!未找到引用源。给出了广义表图的一个例子。
显然,广义表图中画出了广义表的所有结点。图中结点
之间的边表示“包含/属于”关系,即若结点A到B有边, 则表示B是A的子表之一(A包含B)。
广义表图与树相似,只是
L
由于存在共享元素,使得
广义表图中某些结点
A
C
DE
的“父亲”不唯一。
B
c de
ab
图 8-0 广义表L(见下式) 的逻辑图L(A(B(a,b)), C(B(a,b), c), D(c,d,e), E(e) )
12
• 元素分层性:如果将广义表中不同出现的元素看作不 同的元素,则广义表是层次结构,即对任一元素,它只 直属层号比它大1的元素。不过,广义表的层次性与树 不同,在树中,任一元素只直属一个元素。
数据结构之查找课件PPT课件
索引表的定义
struct indexterm {
keytype key; int low, high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
int blksearch (sqlist r, index idx, int k, bn)
{
/*bn为块的个数*/
int i, j, mid, low=1, high=bn, find=0;
while (low<=high && !find)
{
➢ 顺序查找的优点是算法简单、适应面广,且 不要求表中数据有序。缺点是平均查找长度 较大,特别是当n较大时,查找效率较低, 不宜采用。
2.折半查找
➢ 折半查找又称二分查找(Birary search)。 ➢ 假设记录在查找表R[1…n]中按关键字排列有
序。首先用k与查找表中间元素的关键字比 较,。。。。。。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
➢ 顺序查找的线性表定义如下:
Typedef struct rectype {
keytype key; itemtype item1 …… }rectype;
➢ 比较结果有三种可能:
⑴ 如果r[m].key>k,说明如果存在欲查找的元素, 该元素一定在数组的前半部分,查找范围缩小了 一半,修改查找范围的的上界high=m-1,继续对 数组的前半部分进行二分查找;
严蔚敏版数据结构C语言版PPT第九章
度较大,特别不适用于表长较大的查找表。
数
据 结
若以有序表表示查找表,则查找过程
构 可以基于“折半”进行。
折半查找只适用于有序表,且限于顺序存储结构
13
第 9 章 查找 9.2 基于线性表的查找 ②折半查找
基本思想: 数 1.首先确定查找表的中间位置;
据
结 2.然后将待查的值与中间位置的值进行比较, 构 若相等,则查找成功并返回此位置,否则须
50 -2 60 1
80 0 (a)一棵平衡二叉排序树
58 0 (b)一棵失去平衡的二叉排序树
30
第 9 章 查找
9.4 计算式查找法—哈希表
哈希表是什么?
以上两节讨论的表示查找表的各种结构的
数
共同特点:
据
结
1.记录在表中的位置和它的关键
构
字之间不存在一个确定的关系;
2.查找的过程为给定值依次和关 键字集合中各个关键字进行比较;
23
第 9 章 查找 9.3 基于树的查找 ①二叉排序树
例如: 50
数
30
80
据 结
20
40
90
构
10 25 35
66 85
23
88
不 是二叉排序树。
24
第 9 章 查找
9.3 基于树的查找 ①二叉排序树 查找算法
若二叉排序树为空,则查找不成功;
否则,
数 1. 若给定值等于根结点的关键字,则查找成功;
线性表的三种查找方法比较
顺序查找 折半查找 分块查找
数
据 表的结构 有序、无序
有序
表间有序
结
构 表的存储 顺序、链式
顺序
顺序、链式
数据结构 排序 查找 C语言 PPT
key
例. 设哈希表为HT[0..99],哈希函数为: H(K)=取 中间2 H(K)=取k2的中间2位数, 输入关键字序 列:39,21,6,36,38,13,用线性探测再 散列法解决冲突,构造HT[0..99]。 K 39 21 6 36 38 13 k2 1521 0441 0036 1296 1444 0169 H(K) 52 44 03 29 44 16
HT[0..m-1] 0 1 q-1 q q+1
RX
Ki
... Ri
m-1
课堂练习:设 H(k)=k的首字母在字母表中的序号 H(k)=k的首字母在字母表中的序号 的首字母在字母表中的序号,用线性探测再 散列法解决冲突,依次用下列关键字,造哈希表 HT[0..28]。 k A DEC ZMN DAB ZE ANT YY ZOO CAD YES ZY LL DE H(k) 1 4 26 4 26 1 25 26 3 25 26 12 4
例1 人口统计表
例2 学生成绩表
性别 数学 外语
序号 序号 (地址) 年 龄 人 数(万) (地址)学 号 姓 名 1 200041 刘大海 1 1 10.5 2 200042 王 伟 2 2 12.6
3 11.0 4 4 20.8 ... ... 150 150 ... key H(key)=key = 地址 H(年龄)= 年龄 年龄)
1 2 3 4 5 6 7 8 9 10 11 12 13
k H(k) A 1 DEC 4 ZMN 26 DAB 4 ZE 26 ANT 1 YY 25 ZOO 26 CAD 3 YES 25 ZY 26 LL 12 DE 4
HT[0.. 999] 0 1 22 056439527
399 123486790
例. 设哈希表为HT[0..99],哈希函数为: H(K)=取 中间2 H(K)=取k2的中间2位数, 输入关键字序 列:39,21,6,36,38,13,用线性探测再 散列法解决冲突,构造HT[0..99]。 K 39 21 6 36 38 13 k2 1521 0441 0036 1296 1444 0169 H(K) 52 44 03 29 44 16
HT[0..m-1] 0 1 q-1 q q+1
RX
Ki
... Ri
m-1
课堂练习:设 H(k)=k的首字母在字母表中的序号 H(k)=k的首字母在字母表中的序号 的首字母在字母表中的序号,用线性探测再 散列法解决冲突,依次用下列关键字,造哈希表 HT[0..28]。 k A DEC ZMN DAB ZE ANT YY ZOO CAD YES ZY LL DE H(k) 1 4 26 4 26 1 25 26 3 25 26 12 4
例1 人口统计表
例2 学生成绩表
性别 数学 外语
序号 序号 (地址) 年 龄 人 数(万) (地址)学 号 姓 名 1 200041 刘大海 1 1 10.5 2 200042 王 伟 2 2 12.6
3 11.0 4 4 20.8 ... ... 150 150 ... key H(key)=key = 地址 H(年龄)= 年龄 年龄)
1 2 3 4 5 6 7 8 9 10 11 12 13
k H(k) A 1 DEC 4 ZMN 26 DAB 4 ZE 26 ANT 1 YY 25 ZOO 26 CAD 3 YES 25 ZY 26 LL 12 DE 4
HT[0.. 999] 0 1 22 056439527
399 123486790
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i--;
return (i); /*若i为0,表示查找失败,否则R[i]为要找的记录*/
}
※顺序查找算法性能分析:
在顺序查找中,比较次数ci取决于所查记录在表中的位置。如查找记录
R[n]时,仅需比较一次,而查找记录R[1]时,则需比较n次。一般来说,查找 第i个记录的比较次数为ci=n-i+1,因此,查找成功的平均查找长度为:
例 9-1
已知含有10个整数的查找表如下:(9,13,15,7,45,32,56,89,60, 36),从键盘上输入一个整数,用顺序查找的方法在查找表中查找该整数。若 存在,输出该元素的下标值,否则,给出相应的信息。
程序如下:
#include <stdio.h>
#define N 10
main()
low mid high (5) 取mid指示位置的关键字值26与给定值26作比较,显然是相等的,说 明查找成功。所查元素在查找表中的位置即为mid所指示的值。
查找关键字值为75的记录的过程:
8 12 26 37 45 56 64 72 81 89 95
low
mid
high
取mid位置的关键字值56与75作比较,显然75>56,说明要查找的记录在后
{ int x ,p ;
int a[N+1]={0,9,13,15,7,45,32,56,89,60,36};
scanf("%d",&x);
p=seqsearch (a, x);
/*调用顺序查找算法*/
if(p==0)
printf("This number does not exist in this array.\n");
※顺序查找算法如下:
int seqsearch (int R[],int k)
/*元素存放在R的1-N处*/
/*在查找表R中查找关键字为k的记录,查找成功,返回记录在R中的下
标值,否则返回0*/
{
intபைடு நூலகம்i;
R[0] =k;
/*将k放入R[0]中*/
i=N;
/*从最后一个元素开始查找*/
while (R[i]!=k) /*R[0]用来控制循环退出,起“监视哨”的作用*/
查找
9.1 基本概念
查找是指从一组记录集合中找出满足给定条件的记录。 查找表 在讨论查找时,通常假设被查找的对象是由一组 同一类型的记录构成的集合,称这个集合为查找表。 关键字 是指记录的某个数据项,用它可以标识一个记录。 若此关键字可以唯一地标识一个记录,则称此关键字为主关键 字;反之,把可以识别若干记录的关键字称为次关键字。 查找 是指根据某个给定的值,在查找表中查找一个其关 键字值等于给定值的记录。若表中存在这样的一个记录,则称 查找成功;若表中不存在关键字值等于给定值的记录,则称查 找失败。
查找表的C语言定义如下: #define N 100 int R[N+1]; /*使用的地址空间[1..N]*/
9.2.1 顺序查找
基本思想:从查找表的一端开始,逐个将记录的关 键字值和给定值进行比较,如果某个记录的关键字值和 给定值相等,则称查找成功;否则,说明查找表中不存 在关键字值为给定值的记录,则称查找失败。
半部分,待查区间变为[7,11] ,low=mid+1=6+1=7,求得mid=9。
low (1)
mid (6)
high (11)
取mid位置的关键字值56与26作比较,显然26<56,故要查找的26应
该在前半部分,所以下次的查找区间应变为[1,5],即low值不变仍为1,
high的值变为mid-1=5。求得mid=3。
8 12 26 37 45 56 64 72 81 89 95
的定义为:
ASL=
n
pi ci
i 1
其中,n为元素的个数; ci是查找第i 个记录需进行的
比较次数;pi是查找第i个记录的概率,一般可认为查找每
个记录的概率是相等的,即p1=p2=…=pn=1/n。
当ASL不易计算时,使用最大查找长度MSL来衡量算法。
9.2 静态查找表
——基于线性表的查找
此类查找主要有顺序查找、折半查找和索引顺序查找三种 方法。为简便起见,假设查找表中的记录为整型,记录的关 键字即为该整数,记录的个数为N,存放在数组R中。
n
n
ASL成功= pi×ci = pi×(n-i+1)
i 1
i 1
在等概率情况下,即pi=1/n时,查找成功的平均查找长度为(n+1)/2。
若关键字不在表中,则必须经过n+1次比较后才能确定查找失败。所以查找
失败的平均查找长度为n+1。这个结果表明:顺序查找的查找长度是与记录
的个数n成正比的。
结论:顺序查找的优点是算法简单,且对表的结构没有任何 要求。它的缺点是查找效率低,因此,当表中元素个数比较多时, 不宜采用顺序查找。
例
设有一个11个记录的有序表的关键字值如下:
8 12 26 37 45 56 64 72 81 89 95
假设指针low和high分别指示待查元素所在区间的下界和上界,指针
mid指示区间的中间位置。
查找关键字值为26的过程:
mid=(low+high)/2
8 12 26 37 45 56 64 72 81 89 95
else
printf("a[%d]=%d\n",p,x);
}
9.2.2 折半查找(二分查找)
使用折半查找必须具备两个前提条件:
(1)要求查找表中的记录按关键字有序(设,从小到大有序) (2)只能适用于顺序存储结构
基本思想:
先取查找表的中间位置的关键字值与给定关键字值作比较,若它们 的值相等,则查找成功;如果给定值比该记录的关键字值大,说明要查 找的记录一定在查找表的后半部分,则在查找表的后半部分继续使用折 半查找;若给定值比该记录的关键字值小,说明要查找的记录一定在查 找表的前半部分,则在查找表的前半部分继续使用折半查找。…直到查 找成功,或者直到确定查找表中没有待查找的记录为止,即查找失败。
查找技术分为: 1 静态查找表技术 顺序查找、折半查找、索引顺序查找 2 动态查找表技术 二叉查找树 3哈希表技术 哈希表技术
※查找算法的衡量指标
在查找一个记录时所做的主要操作是关键字的比较,
所以通常把查找过程中对关键字的平均比较次数作为衡量
一个查找算法效率优劣的标准,并称平均比较次数为平均
查找长度(Average Search Length)。平均查找长度