第8章 -1 (查找的基本概念)

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ int i=n; while(R[i].key!=k)&&(i>=1) i--; return i; }
3.顺序查找性能分析: ⑴假设在每个位置查找的概率相等,即有pi=1/n,由于
查找是从后往前扫描,则有每个位置的查找比较次数
Cn=1,Cn-1=2,…,C1=n,于是,查找成功的平均查
找ASL=
8.2 线性表的查找
8.2.1 顺序查找 1.顺序查找的基本思想:
⑴从表的一端开始,顺序扫描线性表,依次将扫描到的结点
关键字和待找的值K相比较:
①若相等,则查找成功, ②若整个表扫描完毕,仍末找到关键字等于K的元素, 则查找失败。 ⑵顺序查找既适用于顺序表,也适用于链表:
①顺序表查找可从前往后扫描,也可从后往前扫描
④在索引查找中: 主表只有一个: 包含的是待查找的内容, 索引表可以有多个: 包含一级索引,二级索引……,所需
的级数可根据具体问题而定。
如:刚才的利用读音查找汉字为一级索引, 利用字形查找汉字为二级索引(部首表→检字表→汉字)。 我们仅讨论一级索引。
⑵索引查找是在线性表(主表)的索引存贮结构上进行的,而 索引存贮的基本思想是: ①首先将一个线性表(主表)按照一定的规则分成若干个 逻辑上的子表, 并为每个子表分别建立一个索引项,由 所有这些索引项得到主表的一个索引表, ②可采用顺序或链接的方法来存储索引表和各个子表。 ③索引表中的每个索引项通常包含三个域: 一是索引值域:用来存储标识对应子表的索引值,它相当于 记录的关键字,在索引表中由此索引值来 唯一标识一个索引项(子表); 二是子表的开始位置:用来存储对应子表的第一个元素的 存储位置; 三是子表的长度:用来存储对应子表的元素个数。
第1层),而第k层结点数最多为2k-1个。
假设:该二叉树的深度为h, 则二分查找的成功的平 均查找长度为(假设每个结点的查找概率相等): ASL= p c =1/n c ≤1/n(1+2﹡2+3﹡22+…+h﹡2h-1)
n
n
i 1
i i
i 1
i
①在最坏情形下,上面的不等号将会成立 ,并根据 二叉树的性质,最大的结点数n=2h-1,h=log2(n+1) ②可以得到平均查找长度: ASL=(n+1)/n log2(n+1)-1 ③ log2(n+1)-1 可以作为二分查找成功时的平均查找长度 它的时间复杂度为O(log2n) 。
6. 将找到给定值与关键字的比较次数的平均值来作为衡量
一个查找算法好坏的标准:
⑴对于一个含有n个元素的表,查找成功时的平均查找长
度可表示为ASL= pi ci
i 1 n
pi =1。 ①Pi为查找第i个元素的概率,且 i 1
n
②一般情形下我们认为查找每个元素的概率相等, ③Ci为查找第i个元素所用到的比较次数。
③能唯一标识一个数据元素的关键字称为主关键字,而其 它关键字称为辅助关键字或从关键字。 ⑵查找就是根据给定的值,在一个表中查找出其关键字等于 给定值的数据元素: ①若表中有这样的元素,则称查找是成功的: 查找的信息为给定整个数据元素的输出或指出该元素在表 中的位置; ②若表中不存在这样的记录,则称查找是不成功的,或称查 找失败,并可给出相应的提示。 2.采用何种查找方法,首先取决于使用哪种数据结构来表示 “表”:即表中结点是按何种方式组织的。
(d) 经过三次比较后的情形
[
125 ] low high
17
25
44
77
98
100
115
125 low mid
high
(e) 图 8-2
经过四次比较后的情形(high<low) 查找 K=120 的示意图 (查找不成功)
3.二分查找的性能分析: ⑴用二叉树来描述二分查找过程: 把当前查找区间的中点作为根结点,左子区间和右子区 间 分别作为根的左子树和右子树 ⑵左子区间和右子区间再按类似的方法,由此得到的二叉 树称为二分查找的判定树。 例如:图8-1给定的关键字序列: 8,17,25,44,68,77,98,100,115,125 68 ,的判定树见图8-3。
17 100
8
25
77
115
44
98
125
图 8-3 具有 10 个关键字序列的二分查找判定树
从图8-3 可知:
①查找根结点68,需一次查找 ②查找17和100,各需二次查找 ③查找8、25、77、115各需三次查找 ④查找44、98、125各需四次查找。
⑤结论:二叉树第K层结点的查找次数各为k次(根结点为
115 125
low
(b)
high
mid
经过一次比较后的情形
[8
17
25
44
]
68
77
98
100
115
125
low
mid
high
(c ) 经过二次比较后的情形 图 8-1 (R[mid].key=17)
查找 K=17 的示意图 (查找成功)
[ 8 17 25 44 68 77 98 100 115 125 ]
表8-1 教师档案表
编号 J001 J002 J003 J004 D001 D002 D003 G001 G002 C001 姓名 赵一 钱二 张三 李四 王五 孙六 刘七 朱八 杨九 罗十 部门 计算机系 计算机系 计算机系 计算机系 电工系 电工系 电工系 管理系 管理系 成教部 职称 教授
表8-2
②采用单链表,则只能从前往后扫描。 ③另外,顺序查找的表中元素可以是无序的。
2.顺序查找算法实现: const int n=maxn //n为表的最大长度 struct node {… elemtype key; //key为关键字 };
int seqsearch (node R[n+1],elemtype k) //在表R中查找关键字值为K的元素 { R[0].key=k; int i=n; //从表尾开始向前扫描 while(R[i].key!=k) i--; return i; }
无论是用向量还是用链表来存放结点,
也无论结点之间是否按关键字有序或无
序,它都同样适用。
②顺序查找的缺点:
查找效率低,当n较大时,不宜采用顺序 查找,而必须寻求更好的查找方法。
8.2.2二分查找 1.二分查找的基本思想: ⑴二分查找,也称折半查找,它是一种高效率的查找方法。 ① 二分查找有条件限制:要求表必须用向量作存贮结构,且表中元素 必须按关键字有序(升序或降序均可)。假设表中元素为升序排列。
⑴函数中查找的范围从R[n]到R[1],
⑵R[0]为监视哨,起两个作用: ①为了省去判定 while循环中下标越界的条件i≥1,从而
节省比较时间
②保存要找值的副本,若查找时,遇到它,表示查找不 成功。 ⑶若算法中不设立监视哨R[0],程序花费的时间将会增 加,这时的算法可写为下面形式。
int seqsearch(node R[n+1],elemtype k)
按部门的索引表 index
J
start
0 4 7 9 1 3 2 4
length
讲师 D 副教授 G 助教 C 讲师 助教 副教授 教授 讲师 副教授
若按职称进行索引,则得到的索引表中也有 4个子表, 分别为:
Jiaosou=(a1,a8)
FuJiaosou=(a3,a7,a10)
Jiangshi=(a2,a5,a9) Zhujiao=(a4,a6) 这时的主表用顺序存贮不太方便,因相同职称的教师没 有连在一起,故用链式存储得到主表较方便。具体的存
②二分查找的基本思想是:首先将待查值K与有序表R[1]到R[n]的中点
mid上的关键字R[mid].key进行比较: a.若相等,则查找成功;
b.否则,若R[mid].key>k , 则在R[1]到R[mid-1]中继续查找,若有
R[mid].key<k , 则在R[mid+1]到R[n]中继续查找。
low
(a) 初始情形
high
8
17 25 44 68 [ 77 98 100 115 125 ] mid
(b)
low
high
经过一次比较后的情形
8
17
25
44
68
77
98
100
[
115
125
]
mid
(c) 经过二次比较后的情形
low high
8 17 25 44 68 77 98 100 115 mid
例如,设有一个学校部分教师档案表如表8-1所示,设
编号为主关键字,则该表可以用一个线性表 L=(a1,a2, a3,a4,a5,a6,a7,a8,a9,a10 )来表示,其中 ai (1≤i≤n) 表示第 i 位教师的信息(包含有编号,姓名,部门,职称), 而它的索引表可以按部门进行,也可以按职称进行, 按部门的索引表中有4个子表,分别为: 计算机系J=( a1,a2,a3,a4) 电工系 D=(a5,a6,a7) 管理系G=(a8,a9) 成教部C=(a10) 该4个子表示成一个索引表如表8-2所示。
4.二分查找的优缺点: ⑴ 优点: 比较次数较顺序查找少,查找速度快, 执行效率高。 ⑵缺点: 表的存储结构只能是顺序存储,不能 是链式存储,且表中元素必须是有序的。
8.2.3 索引查找
1.索引查找的思想
⑴索引查找(分级查找): 它既是一种查找方法,又是一种存贮方法,称为索引存贮。 例如:在汉语字典中查找某个汉字时: ①若知道某个汉字读音,则可以先在音节表中查找到对应正文中的页码, 然后再在正文中所对应的页中查出待查的汉字 ②若知道该汉字的字形,但不知道读音,则可以先在部首表中根据字的部 首查找到对应检字表中的页码,再在检字表中根据字的笔画找到该汉字 所在的页码。 ③整个字典就是索引查找的对象,字典的正文是字典的主要部分,被称之 为主表,而检字表,部首表和音节表都是为了方便查找主表而建立的索 引,所以被称之为索引表。
第8章 查找
8.1 查找的基本概念
1. 查找:也称为检索。 如:查找某人的地址、电话号码等,都属于查找范畴。 ⑴查找是按关键字进行的: ①关键字(key):是数据元素(或记录)中某个数据项的值,用 它可以标识(或识别)一个数据元素。 例如:描述一个考生的信息,可以包含:考号、姓名、性别、 年龄、家庭住址、电话号码、成绩等关键字。 ②有些关键字不能唯一标识一个数据元素,而有的关键字可以 唯一标识一个数据元素。 如:考生信息中,姓名不能唯一标识一个数据元素(因有同名同 姓的人),而考号可以唯一标识一个数据元素(每个考生考 号是唯一的,不能相同)。
⑵每通过一次关键字的比较,区间的长度就缩小一半,区间的个数就增
加一倍,如此不断进行下去,直到找到关键字为K的元素;若当前的
查找区间为空(表示查找失败)。
从上述查找思想可知,每进行一次关键字比较,区间数 目增加一倍,故称为二分(区间一分为二),而区间长 度缩小一半,故也称为折半(查找的范围缩小一半)。 2.二分查找算法实现 int binsearch (node R[n+1], elemtype k) { int low=1, high=n; while (low<=high) { int mid=(low +high)/2; //取区间中点 if (R[mid].key= =k) return mid; //查找成功 else if (R[mid].key>k) high=mid-1; //在左子区间中查找 else low=mid+1; //在右子区间中查找 } return 0; //查找失败 }
3.为了提高查找速度,经常使用某些特殊 的数据结构来组织表。 4.研究各种查找算法时,首先必须弄清这 些算法所要求的数据结构,特别是存储 结构。 5.查找有内查找和外查找之分: ⑴ 若整个查找过程全部在内存进行,则称 这样的查找为内查找 ⑵ 若在查找过程中还需要访问外存,则称 之为外查找。我们仅介绍内查找。
p i ci
i 1
n
=
[
i 1
n
1 n
(n i 1)]
=
n 1 2
⑵时间复杂度为O(n)。 这就是说,查找成功的平均比 较次数约为表长的一半。 ⑶若k值不在表中,则必须进行n+1次比较之后才能确
定查找失败。
⑷另处:当n较大时,ASL值较大,查找的效率较低。
⑸顺序查找的特点:
①算法简单,对表结构无任何要求:
例 如 , 假 设 给 定 有 序 表 中 关 键 字 为
8,17,25,44,68,77,98,100,115,125 ,将查找 K=17 和 K=120 的情况描述为图8-1及图8-2形式。
[ 8 low
(a) 初始情形
Leabharlann Baidu17
25
44
68
77
98
10
115
125 high
]
[
8
17 25 44 ] 68 44 98 100
相关文档
最新文档