数据结构 C语言版(严蔚敏版)第9章 查找
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(b)
2
40
K=80
3
80
4
30
5
60
6
25
7
(return i=4) 30 60
90
10
(c)
20
40 K=90
80
25
(return i=0 )
根据上述算法可知: 查找成功时的平均查找次数为: ASL=(1+2+3+4+……+n)/n=(n+1)/2 查找不成功时的比较次数为: n+1 则顺序查找的平均查找长度为: ASL==((n+1)/2+n+1)/2=(n+1)3/4 顺序查找的优点:算法简单,无需排序,采用顺序 和链式存储均可。
ຫໍສະໝຸດ Baidu
基本概念
查找表 用于查找的数据元素集合称为查找 表。查找表由同一类型的数据元素(或记录) 构成。 静态查找表 若只对查找表进行如下两种操 作:(1)在查找表中查看某个特定的数据元素 是否在查找表中,(2)检索某个特定元素的各 种属性,则称这类查找表为静态查找表。静态 查找表在查找过程中查找表本身不发生变化。 对静态查找表进行的查找操作称为静态查找。
(a) 初态 0 1 2 3 4 5 6 7
10
20
40
80
30
60
25
(b)
K=80
(return i=4)
改进的顺序查找的算法:
int Search_seq(SSTable ST, int n, int key) { int i=n; ST[0].key=key;
使用了监视哨, 在查找过程中, 不用每一步都去 判断是否查找结 束。
动态查找表:若在查找过程中可以将查找 表中不存在的 数据元素插入 ,或者从查找表中 删除某个数据元素 ,则称这类查找表为动态查 找表。动态查找表在查找过程中查找表可能会 发生变化。对动态查找表进行的查找操作称为 动态查找。 关键字:是数据元素中的某个数据项。唯 一能标识数据元素(或记录)的关键字,即每 个元素的关键字值互不相同,我们称这种关键 字为主关键字;若查找表中某些元素的关键字 值相同,称这种关键字为次关键字。例如,银 行帐户中的帐号是主关键字,而姓名是次关键 字。
10
65
865
学习提要
第9章 查找
本章中介绍下列主要内容: 静态查找表及查找算法:顺序查找、折半查找 动态查找表及查找算法:二叉排序树 哈希表及查找算法
学习提要(具体来讲) 1.熟练掌握顺序表和有序表的查找方法。 2.熟练掌握二叉排序树的构造和查找方法。 3.掌握二叉平衡树的维护平衡方法。 4.理解树的特点以及它们的建树过程。 5 . 熟练掌握哈希表的构造方法,深刻理解哈 希表与其它结构的表的实质性的差别。 6 . 掌握描述查找过程的判定树的构造方法, 以及按定义计算各种查找方法在等概率情况下 查找成功时的平均查找长度。
假设在查找表中 ,数据元素个数为 n (
n<MAX_NUM),并分别存放在数组的下标变 量ST[1]~ST[n]中。 下面我们给出顺序查找的完整算法。
int seq_search (SSTable ST,int key) {//在顺序表中查找关键字值等于key的记录, // 若查找成功,返回该记录的位置下标序号, 否则返回0 i=1; while (i<=n && ST[i].key != key) i++; if (i<=n) retrun i; else return 0; 0 1 2 3 4 5 6 7 10 20 40 80 30 60 25 }
查找表的存储结构:查找表是一种非常灵活的 数据结构,对于不同的存储结构,其查找方法 不同。为了提高查找速度,有时会采用一些特 殊的存储结构。本章将介绍以线性结构、树型 结构及哈希表结构为存储结构的各种查找算法 。 查找算法的时间效率:查找过程的主要操作 是关键字的比较,所以通常以“平均比较次数 ”来衡量查找算法的时间效率。
while(ST[i].key!=key) i- -;
return i; }
0 1 0
/*从表尾往前查*/ 找到:返回元素 的存 1 2 3 4 在线 5 性表 6 中7 10 20 40 80 储位置; 30 60 25 (a) 初态 未找到:返回0。
2 3 4 5 6 7
80
监视哨 0
10
1
20
查找过程:
对给定的一关键字 K,从线性表的一端开始,逐个进 行记录的关键字和 K 的比较,直到找到关键字等于 K 的记 录或到达表的另一端。
·可以采用从前向后查,也可采用从后向前查的方法。 · 在平均情况下,大约要与表中一半以上元素进行比较 效率较低。平均查找长度较大。 · 在下面两种情况下只能采取顺序查找: a. 线性表为无序表(元素排列是无序的); b. 即使是有序线性表,但采用的是链式存储结构。
9.1 静态查找表 9.1.1. 顺序查找(线性查找)
静态查找是指在静态查找表上进行的查找
操作,在查找表中查找满足条件的数据元素的
存储位置或各种属性。本节将讨论以线性结构
表示的静态查找表及相应的查找算法。
顺序查找的基本思想: 顺序查找是一种最简单的查找方法。其基本 思想是将查找表作为一个线性表,可以是顺序 表,也可以是链表,依次用查找条件中给定的 值与查找表中数据元素的关键字值进行比较, 若某个记录的关键字值与给定值相等,则查找 成功,返回该记录的存储位置,反之,若直到 最后一个记录,其关键字值与给定值均不相等 ,则查找失败,返回查找失败标志。
查找:在数据元素集合中查找满足某种条 件的数据元素的过程称为查找。最简单且最常 用的查找条件是“关键字值等于某个给定值” ,在查找表搜索关键字等于给定值的数据元素 (或记录)。若表中存在这样的记录,则称查 找成功,此时的查找结果应给出找到记录的全 部信息或指示找到记录的存储位置;若表中不 存在关键字等于给定值的记录,则称查找不成 功,此时查找的结果可以给出一个空记录或空 指针。若按主关键字查找,查找结果是唯一的 ;若按次关键字查找,结果可能是多个记录, 即结果可能不唯一。
(1)顺序查找 (线性表在顺序存储结构下的顺序查找)
数据结构:
#define MAX_NUM 100 //用于定义表的长度 每个结点包含两部分 内容:Key 和info 其他 信息
typedef struct{ int key; float info; }SSTable[MAX_NUM],SSItem ;
2
40
K=80
3
80
4
30
5
60
6
25
7
(return i=4) 30 60
90
10
(c)
20
40 K=90
80
25
(return i=0 )
根据上述算法可知: 查找成功时的平均查找次数为: ASL=(1+2+3+4+……+n)/n=(n+1)/2 查找不成功时的比较次数为: n+1 则顺序查找的平均查找长度为: ASL==((n+1)/2+n+1)/2=(n+1)3/4 顺序查找的优点:算法简单,无需排序,采用顺序 和链式存储均可。
ຫໍສະໝຸດ Baidu
基本概念
查找表 用于查找的数据元素集合称为查找 表。查找表由同一类型的数据元素(或记录) 构成。 静态查找表 若只对查找表进行如下两种操 作:(1)在查找表中查看某个特定的数据元素 是否在查找表中,(2)检索某个特定元素的各 种属性,则称这类查找表为静态查找表。静态 查找表在查找过程中查找表本身不发生变化。 对静态查找表进行的查找操作称为静态查找。
(a) 初态 0 1 2 3 4 5 6 7
10
20
40
80
30
60
25
(b)
K=80
(return i=4)
改进的顺序查找的算法:
int Search_seq(SSTable ST, int n, int key) { int i=n; ST[0].key=key;
使用了监视哨, 在查找过程中, 不用每一步都去 判断是否查找结 束。
动态查找表:若在查找过程中可以将查找 表中不存在的 数据元素插入 ,或者从查找表中 删除某个数据元素 ,则称这类查找表为动态查 找表。动态查找表在查找过程中查找表可能会 发生变化。对动态查找表进行的查找操作称为 动态查找。 关键字:是数据元素中的某个数据项。唯 一能标识数据元素(或记录)的关键字,即每 个元素的关键字值互不相同,我们称这种关键 字为主关键字;若查找表中某些元素的关键字 值相同,称这种关键字为次关键字。例如,银 行帐户中的帐号是主关键字,而姓名是次关键 字。
10
65
865
学习提要
第9章 查找
本章中介绍下列主要内容: 静态查找表及查找算法:顺序查找、折半查找 动态查找表及查找算法:二叉排序树 哈希表及查找算法
学习提要(具体来讲) 1.熟练掌握顺序表和有序表的查找方法。 2.熟练掌握二叉排序树的构造和查找方法。 3.掌握二叉平衡树的维护平衡方法。 4.理解树的特点以及它们的建树过程。 5 . 熟练掌握哈希表的构造方法,深刻理解哈 希表与其它结构的表的实质性的差别。 6 . 掌握描述查找过程的判定树的构造方法, 以及按定义计算各种查找方法在等概率情况下 查找成功时的平均查找长度。
假设在查找表中 ,数据元素个数为 n (
n<MAX_NUM),并分别存放在数组的下标变 量ST[1]~ST[n]中。 下面我们给出顺序查找的完整算法。
int seq_search (SSTable ST,int key) {//在顺序表中查找关键字值等于key的记录, // 若查找成功,返回该记录的位置下标序号, 否则返回0 i=1; while (i<=n && ST[i].key != key) i++; if (i<=n) retrun i; else return 0; 0 1 2 3 4 5 6 7 10 20 40 80 30 60 25 }
查找表的存储结构:查找表是一种非常灵活的 数据结构,对于不同的存储结构,其查找方法 不同。为了提高查找速度,有时会采用一些特 殊的存储结构。本章将介绍以线性结构、树型 结构及哈希表结构为存储结构的各种查找算法 。 查找算法的时间效率:查找过程的主要操作 是关键字的比较,所以通常以“平均比较次数 ”来衡量查找算法的时间效率。
while(ST[i].key!=key) i- -;
return i; }
0 1 0
/*从表尾往前查*/ 找到:返回元素 的存 1 2 3 4 在线 5 性表 6 中7 10 20 40 80 储位置; 30 60 25 (a) 初态 未找到:返回0。
2 3 4 5 6 7
80
监视哨 0
10
1
20
查找过程:
对给定的一关键字 K,从线性表的一端开始,逐个进 行记录的关键字和 K 的比较,直到找到关键字等于 K 的记 录或到达表的另一端。
·可以采用从前向后查,也可采用从后向前查的方法。 · 在平均情况下,大约要与表中一半以上元素进行比较 效率较低。平均查找长度较大。 · 在下面两种情况下只能采取顺序查找: a. 线性表为无序表(元素排列是无序的); b. 即使是有序线性表,但采用的是链式存储结构。
9.1 静态查找表 9.1.1. 顺序查找(线性查找)
静态查找是指在静态查找表上进行的查找
操作,在查找表中查找满足条件的数据元素的
存储位置或各种属性。本节将讨论以线性结构
表示的静态查找表及相应的查找算法。
顺序查找的基本思想: 顺序查找是一种最简单的查找方法。其基本 思想是将查找表作为一个线性表,可以是顺序 表,也可以是链表,依次用查找条件中给定的 值与查找表中数据元素的关键字值进行比较, 若某个记录的关键字值与给定值相等,则查找 成功,返回该记录的存储位置,反之,若直到 最后一个记录,其关键字值与给定值均不相等 ,则查找失败,返回查找失败标志。
查找:在数据元素集合中查找满足某种条 件的数据元素的过程称为查找。最简单且最常 用的查找条件是“关键字值等于某个给定值” ,在查找表搜索关键字等于给定值的数据元素 (或记录)。若表中存在这样的记录,则称查 找成功,此时的查找结果应给出找到记录的全 部信息或指示找到记录的存储位置;若表中不 存在关键字等于给定值的记录,则称查找不成 功,此时查找的结果可以给出一个空记录或空 指针。若按主关键字查找,查找结果是唯一的 ;若按次关键字查找,结果可能是多个记录, 即结果可能不唯一。
(1)顺序查找 (线性表在顺序存储结构下的顺序查找)
数据结构:
#define MAX_NUM 100 //用于定义表的长度 每个结点包含两部分 内容:Key 和info 其他 信息
typedef struct{ int key; float info; }SSTable[MAX_NUM],SSItem ;