第九章 查找(1)-2012-11-27
九章查找Search
i 1
A S L
Pi Ci
n
其中: n 为表长,Pi 为查找表中第i个记录的概率,假设
每次查找都是成功的,则有pi=1
Ci为找到该记录时,比较过的关键字的个数, Ci = n-i+1,ASL = nP1 +(n-1)P2 +…+2Pn-1+Pn,如果要
查找的元素在表中的任何位置的概率是相等的,p=1/n ,ASL=(n+1)/2
第九章 查找(Search)
9.1 基本概念 9.2 静态查找表 9.3 动态查找表 9.4 Hash表
9.1 基本概念
如何评估查找方法的优劣?
查找的过程就是将给定的值与文件中各记录的关
键字逐项进行比较的过程。所以用比较次数的平均值
来评估算法的优劣,称为平均查找长度(ASL:
average search length)。i1
三、索引顺序表的查找(分块查找)
分块查找的数据结构:
D={d1,d2,….,dn} 1. 将n个数据元素分为s个块 B1,B2, …, Bs ; 2. 块之间有序:Bi+1中的任一元素小于Bi中的任一元
return ERROR; T->data = R[i]; // 生成结点
if (i==low) T->lchild = NULL; // 左子树空 else SecondOptimal(T->lchild, R, sw, low, i-1);
// 构造左子树 if (i==high) T->rchild = NULL; // 右子树空 else SecondOptimal(T->rchild, R, sw, i+1, high);
第九章 查找
} // Search_Seq
例:在顺序查找表中查找key=8的关键字 ST.elem
0 8 1 100 2 10 3 0 4 8 i 5 1 6 3 7 7
查找成功 i=4
9.1.1 顺序表的查找性能分析
等概率下查找成功的平均查找长度:Pi=1/n;Ci=n-i+1,
1 ASLSS n
(n i 1)
9.1.2 有序表的查找的性能分析
•判定树:用二叉树描述折半查找过程,树中每个结点表示一个 记录,结点值为该记录在表中的位臵,结点所在的层次表示查找 该值需要进行的比较次数。则有如下的表:
位臵 0 1 2 3 4 5 6 7 8 9 10 11
05 13 19 21 37 56 64 75 80 88 92
} // Search_Seq
例:在顺序查找表中查找key=8的关键字 ST.elem
0 8 1 100 2 10 3 0 4 8 5 1 6 3 i 7 7
9.1.1 顺序表的查找
适用场合:以顺序表表示静态查找表,表内元素无序。
思想:从表中最后一条记录起,逐个比较记录关键字与给定值, 若相等查找成功;反之,直至与第一条记录不等,查找不成功 int Search_Seq( SSTable ST, KeyType key ) { ST.elem[0]. key = key;//哨兵 for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i ); return i;
比较次数 0 3 4 2 3 4 1 3 4 2 3 4
查找的定义和术语(2)
“特定的”数据元素 关键字(Key):数据元素中某个数据项的值,用以标识一个 数据元素 主关键字(Primary Key):可以唯一标识一个记录的关键 字 次关键字(Secondary Key):用以识别若干记录的关键 字 查找(Searching):根据给定值,在查找表中确定一个其关 键字等于给定值的数据元素或记录. 查找成功(Searching Success):若存在这一记录,给 出该记录信息或指示该记录在表中的位臵 查找不成功(Searching Failed):若查找表中不存在这 一记录,给出“空记录”或“空指针”。
(完整word版)数据结构第九章查找
第九章查找:习题习题一、选择题1.散列表查找中k个关键字具有同一散列值,若用线性探测法将这k个关键字对应的记录存入散列表中,至少要进行( )次探测。
A. k B。
k+l C. k(k+l)/2 D. l+k (k+l)/22.下述命题( )是不成立的。
A。
m阶B-树中的每一个结点的子树个数都小于或等于mB。
m阶B-树中的每一个结点的子树个数都大于或等于『m/2-1C。
m阶B-树中的每一个结点的子树高度都相等D。
m阶B—树具有k个子树的非叶子结点含有(k-l)个关键字3.如果要求一个基本线性表既能较快地查找,又能适应动态变化的要求,可以采用( )查找方法.A。
分块 B. 顺序 C. 二分 D.散列4.设有100个元素,用折半查找法进行查找时,最大比较次数是( ),最小比较次数是( ).A。
7,1 B.6,l C.5,1 D. 8,15.散列表长m=15,散列表函数H(key)=key%13。
表中已有4个结点:addr(18)=5;addr(32)=6; addr(59)=7;addr(73)=8;其余地址为空,如果用二次探测再散列处理冲突,关键字为109的结点的地址是( )。
A. 8 B。
3 C. 5 D。
46.用分块查找时,若线性表中共有729个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分( )个结点最佳。
A。
15 B. 27 C。
25 D。
307.散列函数有一个共同性质,即函数值应当以( )取其值域的每个值。
A.同等概率B。
最大概率C。
最小概率D。
平均概率8.设散列地址空间为O.。
m—1,k为关键字,假定散列函数为h(k)=k%p,为了减少冲突,一般应取p为( )。
A.小于m的最大奇数B. 小于m的最大素数C.小于m的最大偶数D.小于m的最大合数9.当向一棵m阶的B-树做插入操作时,若使一个结点中的关键字个数等于( ),则必须分裂成两个结点。
A。
m B。
m-l C.m+l D。
第9章查找
high指向待查元素所 在区间的上界
(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11]; (2) 若 ST.elem[mid].key < key,说明 key[ mid+1,high] , 则令:low =mid+1;重算 mid= (low+high)/2;. (3) 若 ST.elem[mid].key > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ; (4)若 ST.elem[ mid ].key = key,说明查找成功,元素序号=mid; 结束条件: (1)查找成功 : ST.elem[mid].key = key (2)查找不成功 :high<low (意即区间长度小于0)
2013-12-24
2
2、对查找表常用的操作:
查询某个“特定的”数据元素是否在表中; 查询某个“特定的”数据元素的各种属性; 在查找表中插入一元素; 从查找表中删除一元素。
静态查找表(Static Search Table):对查找表只做 前两种“查找”操作 动态查找表(Dynamic Search Table) :对查找表 要进行后两种“查找”操作
2013-12-24
8 75 i
9 80 i
10 88 i
11 92 i
比较次数=5
6
不设置监视哨的顺序查找算法
int SeqSearch( SSTable ST, KeyType key) /*不用监视哨法,在顺序表中查找关键字等于key的元素*/ {
i=ST.length;
while (i>=1&&ST. elem[i].key!=key) i--;
数据结构第九章--查找-习题及答案
第九章查找一、选择题1。
若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。
A. (n—1)/2 B. n/2 C。
(n+1)/2 D。
n2. 下面关于二分查找的叙述正确的是( )A。
表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B。
表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度( )A. 3。
1 B。
4 C. 2。
5 D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C。
数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6。
二叉查找树的查找效率与二叉树的( (1))有关, 在((2))时其查找效率最低(1): A。
高度 B。
结点的多少 C. 树型 D. 结点的位置(2): A。
结点太多 B. 完全二叉树 C。
呈单枝树 D. 结点太复杂。
7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A。
相同的 B。
不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()A.(100,80, 90, 60, 120,110,130) B。
(100,120,110,130,80, 60, 90) C。
(100,60, 80, 90, 120,110,130) D。
查找-数据结构
平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称ASL。
对于含有n个记录的表,查找成功时的平 均查找长度为: n ASL PiCi i 1
其找到中表:中Pi为其查关找键表字中与第给i定个值记相录等的的概第率,i个C记i为 录时和给定值已进行过比较的关键字个数。
(1)若*p 为叶子结点,直接删除即可。
45
45
12
3
37
53
f
100
24
p
61
60
90
12
53
3
删除24
f->lchild = null; delete p;
37
100
61
60
90
78
78
(2)若*p结点只有左子树PL或只有右子树PR,此 时只要令PL或PR直接成为*f的左子树即可
f
F
f
F
p
P
p
二叉排序树的插入
基本思想:
若二叉排序树为空,则待插结点作为根结点插入 到空树中;
若待插结点的关键字值和根结点的关键字值相等, 则说明树中已有此结点,无需插入;
若待插结点的关键字值小于根结点的关键字值, 则将待插结点插入到根的左子树中;
若待插结点的关键字值大于根结点的关键字值, 则将待插结点插入到根的右子树中;
mid low
mid low
mid low
mid low
mid
mid
mid
mid
6
3
9
1
47
10
2
58
11
由此可见,二分查找过程恰好是走了一条从判 定树的根到被查结点的路径,比较的关键字个 数恰为该结点在判定树中的层数。
第九章 查找
1. 若KeyValue小于Data[middle]:
判定树
折半查找的过程可以用二叉树来表示。判定树即 描述查找过程的二叉树,树中每个节点表示表中 一个记录,节点的值为该记录在表中的位置。 查找表中任一记录成功的过程就是走了一条从根 节点到与该记录相应节点的路径。 比较的次数恰好为该节点在判定树上的层次树。 由于具有n个节点的判定树的高度为log2n+1, 所以折半查找时与给定值进行比较的次数最多为 log2n+1次。
表示KeyValue可能出现在Data[middle]之后,所以查找 Data[middle+1]到Data[n]之间的数据。 这时left = middle + 1,right = right,而middle = ( left + right ) / 2
3. 若KeyValue等于Data[middle]:
表示KeyValue可能出现在Data[middle]之前,所以查找Data[0]到 Data[middle-1]之间的数据。 这时left = left,right = middle - 1,而middle = ( left + right ) / 2
2. 若KeyValue大于Data[middle]:
9.2 线性查找
查找成功时的平均查找长度 从线性查找的过程得知,对于有n个记录的查找表,Ci取决 于所查记录在表中的位置。如查找表中最后一个记录时需比 较n次,查找表中第一个记录时需比较1次。因此,线性查找 成功时的平均查找长度为 ASL=P1 + 2P2+ …… (n-1)Pn-1+nPn 假设每个记录的查找概率相等,即Pi=1/n,则在等概率 情况下线性查找成功时的平均查找长度为
数据结构-第九章 查找
数据结构-第九章查找在计算机科学的世界里,数据结构就像是一个精心设计的仓库,用于高效地存储和管理数据。
而查找,作为数据结构中的重要一环,它的作用就如同在这个庞大的仓库中迅速找到我们需要的宝贝。
当我们面对大量的数据时,如何快速准确地找到特定的信息,这是查找要解决的核心问题。
在第九章中,我们会深入探讨几种常见的查找算法和数据结构。
首先,我们来谈谈顺序查找。
这是最简单也是最直观的查找方法。
想象一下,我们有一个长长的列表,就像一排摆放整齐的物品,要找某个特定的东西,我们只能从第一个开始,一个一个地依次检查,直到找到目标或者遍历完整个列表。
这种方法虽然简单直接,但效率并不高,特别是当数据量很大时,查找的时间会很长。
与顺序查找相对的是二分查找。
二分查找就聪明多了,它要求数据是有序的。
就好像我们知道物品是按照大小顺序摆放的,每次都可以通过比较中间的元素来判断目标在左边还是右边,然后不断缩小查找的范围。
通过这种方式,查找的效率大大提高。
比如说,在一个有 100 个元素的有序列表中,最多只需要 7 次比较就能找到目标元素。
接下来是二叉查找树。
它是一种特殊的数据结构,每个节点最多有两个子节点,左子节点的值小于父节点,右子节点的值大于父节点。
通过这种特殊的结构,我们可以快速地在树中查找目标元素。
插入和删除操作也相对方便,但要注意保持树的平衡,否则查找的效率可能会下降。
还有哈希表,这是一种非常高效的查找结构。
它通过一个哈希函数将关键字映射到一个特定的位置。
如果哈希函数设计得好,查找的时间复杂度可以接近常数级别。
但哈希表也有它的问题,比如可能会出现哈希冲突,需要通过合适的冲突解决方法来处理。
在实际应用中,选择哪种查找方法取决于具体的情况。
如果数据量较小,顺序查找可能就足够了;如果数据是有序的,二分查找是个不错的选择;如果需要频繁的插入和删除操作,二叉查找树可能更合适;而对于大规模数据且查找操作频繁的情况,哈希表往往能发挥出巨大的优势。
第+9+章+查找n
else return 0 ; 0 1 2 3 4 5
一次查找所需的平均
6 7 8 9 10 11
}
60 5 37 19 21 13 5时6 间6几4 乎92减少88一半80。75
优点:算法简单,适应面广。 顺序查找
缺点:平均查找长度大,不适用于表长大的查找表。
制作:计算机科学与技术系 徐振中
数据结构
typedef struct { ElemType * elem; int length; // 表长度
} SSTable;
静态查找表的顺序存储结构
制作:计算机科学与技术系 徐振中
数据结构
第九章 查找
当静态查找表用不同的方法表示时,实现查找操作的
方法也不同。
顺序表 表示静态查找表
线性链表
顺序查找
9.1.1 顺序表的查找(顺序查找)
而这样的“查询”或“检索”是任何计算机应用系统中使用频 度都很高的操作,因此设法提高查找表的查找效率,是本章讨 论问题的出发点。
可以想像的到,如果能有目标地进行查找肯定比在一大堆 事物中瞎摸要有效得多,因此为提高查找效率,一个办法就是 在构造查找表时,在集合中的数据元素之间人为地加上某种确 定的约束关系。本章正是讨论查找表的各种组织方法及其查找 过程的实施。
2、记录的查找概率无法测定时如何提高查找效率?
方法:
1)、在每个记录中设一个访问频度域;
2)、始终保持记录按非递增有序的次序排列;
3)、每次查找后均将刚查到的记录直接移至表头。
制作:计算机科学与技术系 徐振中
▲
数据结构
第九章 查找
9.1.2 有序表的查找(折半查找)
有序表表示静态查找表
折半查找
数据结构第九章:查找
low high mid
8
1 5
2 13
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
high low 1 5 2 13 3 19 4 21 5 37 6 56 6 3 1 2
算法描述: 算法描述:ENTER
9
7 64
8 75
9 80
10 88
11 92
判定树: 判定树:
17
考试题型介绍: 考试题型介绍:
1. 填空题 若用链表存储一棵二叉树时,每个结点除数据域外, 若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右 孩子的两个指针。在这种存储结构中, 个结点的二叉树共有 个结点的二叉树共有________个 孩子的两个指针。在这种存储结构中,n个结点的二叉树共有 个 指针域,其中有________个指针域是存放了地址,有 指针域,其中有 个指针域是存放了地址, 个指针域是存放了地址 ________________个指针是空指针。 个指针是空指针。 个指针是空指针 2. 选择题 设有序表中有1000个元素,则用二分查找查找元素X最多需要比较( )次 个元素,则用二分查找查找元素 最多需要比较 最多需要比较( 设有序表中有 个元素 A. 25 3. 简答题 已知序列( , , , , , , , , , ) 已知序列(10,18,4,3,6,12,1,9,18,8)请用快速排序写出每一 趟排序的结果。 趟排序的结果。 4. 算法题 设计判断单链表中元素是否是递增的算法。 设计判断单链表中元素是否是递增的算法。 已知: 已知: 1. 单链表已存在,并带有头结点; 单链表已存在,并带有头结点; 2. 要求写出详细的算法步骤或画出详细的流程图; 要求写出详细的算法步骤或画出详细的流程图; B. 10 C. 7 D. 1
数据结构-第九章 查找
数据结构-第九章查找数据结构第九章查找在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地进行访问、操作和管理。
而查找,作为数据结构中的一个重要概念,在我们处理和分析数据的过程中起着关键作用。
查找,简单来说,就是在一组数据中寻找特定的元素。
这听起来似乎很简单,但实际上,它涉及到一系列复杂的算法和策略,以确保能够快速准确地找到我们所需的信息。
让我们先来了解一下顺序查找。
顺序查找是最简单也是最直观的查找方法。
它的基本思想就是从数据集合的开头,逐个元素地进行比较,直到找到目标元素或者遍历完整个集合。
这种方法对于小型数据集或者数据没有特定规律的情况是可行的,但效率相对较低。
想象一下,你要在一本没有索引的电话簿中查找一个人的号码,只能从头开始一个一个地翻,这就是顺序查找的过程。
与顺序查找相对的是二分查找。
二分查找要求数据集合是有序的。
它通过不断地将数据集一分为二,比较目标元素与中间元素的大小,从而缩小查找范围。
这种方法的效率比顺序查找高得多。
比如说,要在一本按照姓名拼音排序的电话簿中查找一个人,我们可以先比较中间的名字,如果目标在前面,就只在前半部分继续查找,反之则在后半部分查找,如此反复,大大提高了查找的速度。
除了上述两种常见的查找方法,还有哈希查找。
哈希查找的核心是通过一个哈希函数将元素映射到一个特定的位置。
哈希函数的设计至关重要,一个好的哈希函数能够使得元素均匀地分布在哈希表中,减少冲突的发生。
当我们要查找一个元素时,通过哈希函数计算出其可能的位置,然后进行比较。
如果哈希函数设计得不好,可能会导致大量的冲突,从而影响查找效率。
在实际应用中,选择合适的查找方法取决于多个因素。
数据的规模是一个重要的考虑因素。
如果数据量较小,顺序查找可能就足够了;但对于大规模的数据,二分查找或者哈希查找通常更合适。
数据的分布情况也会影响选择。
如果数据分布比较均匀,哈希查找可能效果较好;如果数据有序,二分查找则更具优势。
[课件]数据结构 第九章 查找
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 一趟分组: 38 65 97 76 13 27 48 55 4
一趟排序:13 27 48 55 4 取d2=3 13 二趟分组: 27 48 55 4
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 三趟分组: 4 48 55 27 49 38 65 97 76
第十章 排序
排序定义——将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫~ 排序分类
按待排序记录所在位置
内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序
按排序依据原则
插入排序:直接插入排序,折半插入排序,希尔排序 交换排序:冒泡排序,快速排序 选择排序:简单选择排序,堆排序 归并排序:2-路归并排序 基数排序
4 一趟排序:13 27 48 38 27 49 55 65 97 76 55 4 38 j j j ji ij ij ij i i i
二趟排序: 13 4 48 38 27 49 55 65 97 76 Ch8_3.c
希尔排序特点
子序列的构成不是简单的"逐段分割",而是将相隔某个增 量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体 上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1
2 ( n + 4 )( n 1 ) ( i + 1) = 2
数据结构第九章--查找-习题及答案
第九章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。
A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 下面关于二分查找的叙述正确的是 ( )A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度()A. 3.1B. 4C. 2.5D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6. 二叉查找树的查找效率与二叉树的( (1))有关, 在 ((2))时其查找效率最低(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。
7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A. 相同的B.不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( ) A.(100,80, 90, 60, 120,110,130) B.(100,120,110,130,80, 60, 90)C.(100,60, 80, 90, 120,110,130)D. (100,80, 60, 90, 120,130,110)10. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作( ) 型调整以使其平衡。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Traverse(ST, Visit());
初始条件:静态查找表ST存在, Visit是对元素操作的 应用函数; 操作结果:按某种次序对ST的每个元素调用函数Visit() 一次且仅一次,一旦Visit()失败,则操作失败。 } ADT StaticSearchTable
14
9.1 静态查找表
9.1.1 顺序表的查找 9.1.2 有序表的查找 9.1.4 索引顺序表的查找
显然,ASL值越小,时间效率越高。
11
第一小节
9.1 静态查找表
12
9.1 静态查找表
抽象数据类型静态查找表: ADT StaticSearchTable { 数据对象 D : D 是具有相同特性的数据元素的集合。 每个数据元素含有类型相同的关键字,可唯一标识 数据元素。 数据关系R:数据元素同属一个集合。 基本操作P:
8 0
100 1
10 2 i
……………… 0 n-3
7 n-2
1 n-1
3 n
key
数组 ST.elem
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1
3 n
21
9.1 静态查找表
key
数组 ST.elem
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1
3 n
100 1
10 2
……………… 0 n-3
8 n-2
• 查找成功,则 i 是key 值为 8 的结点所在的数组 元素的下标。
19
9.1 静态查找表
i key
数组 ST.elem
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1 i
3 n
key
数组 ST.elem
8 0
100 1
10 2
7
第九章
• 如何进行查找?
查
找
取决于查找表的结构,即:记录在查找表中所处 的位置。 查找表本身是一种很松散的结构,因此,为了提 高查找的效率,需要在查找表中的元素之间人为 地附加某种确定的关系,换句话说,用另外一种 结构来表示查找表,以便按某种规则进行查找。
8
第九章
查
找
• 典型的关键字类型说明:P215
15
9.1 静态查找表
• 实现:
int Search_Seq( Sstable ST, KeyType key )
{ ST.elem[0]. key = key; //设立哨兵,可免去查找过程
中每一步都要检测是否查找完毕。
for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i ) ;//从后往前找
return i; // 找不到时,i返回 0,查找失败,否则 ,找到 key 所在的数组元素的下标地址
} // Search_Seq
16
9.1 静态查找表
• 设置哨兵的好处:
在顺序表中总可以找到待查结点。否则,必须将
判断条件 i >= 0 加进 for语句。
17
9.1 静态查找表
• 例:查找 key = 8 的结点所在的数组元素的下标
27
9.1 静态查找表
例:查找key=9的结点所在数组元素的下标地址。
查找成功的情况:数组 ST.elem 如下图所示有序 数组 ST.elem :递增序 ST.elem[i]. Key <= ST.elem[i+1]. Key; i= 1,2,……n-1 查找范围:low(低下标)= 1; high(高下标)= 7; 比较对象:中点元素,其下标地址为 mid = (low+high) / 2 =4
第九章
查
找
9.1 静态查找表 9.1.1 顺序表的查找 9.1.2 有序表的查找 9.1.4 索引顺序表的查找 9.2 动态查找表 9.2.1 二叉排序树 9.3 哈希表 9.3.1 什么是哈希表 9.3.2 哈希函数的构造方法 9.3.3 处理冲突的方法 9.3.4 哈希表的查找及其分析
1
第九章
分析: 查找第1个元素所需的比较次数为1; 查找第2个元素所需的比较次数为2; …… 查找第n个元素所需的比较次数为n;
未考虑查找不成功的 情况:查找哨兵所需 的比较次数为n+1
总计全部比较次数为:1+2+…+n = (1+n)n/2 若求某一个元素的平均查找次数,还应当除以n(等概率), 即: ASL=(1+n)/2 ,时间效率为 O(n)
Create(&ST, n);
操作结果:构造一个含 n 个数据元素的静态查找表 ST 。
Destroy(&ST);
初始条件:静态查找表ST存在; 操作结果:销毁表ST。
13
9.1 静态查找表
Search(ST, key);
初始条件:静态查找表ST存在,key为和查找表中元素 的关键字类型相同的给定值; 操作结果:若ST中存在其关键字等于key的数据元素, 则 函 数 值为 该 元 素的 值 或 在表 中 的 位置 , 否 则为 “空”。
一、顺序查找表 以顺序表或线性链表表示静态查找表 顺序表的查找:从表中最后一个记录始,进行记录的 关键字和给定值的比较 表示: typedef struct { ElemType * elem; //数据元素存储空间基址,建表时按实际
长度分配,0号单元留空 int length;//表长度
} SStable; // length = n+1, n:结点个数
……………… 0 n-3
7 n-2 i
1 n-1
3 n
key
数组 ST.elem
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1
3 n
20
9.1 静态查找表
i key
数组 ST.elem
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1
3 n
i key
数组 ST.elem
这是查找成功的情况
24
9.1 静态查找表
• 顺序查找的优缺点:
优点:简单且适用面广,对表的结构没有要求, 无论记录是否按关键字有序都可应用。 缺点:效率低。平均查找长度较大,特别不适用 于表长较大的查找表
25
9.1 静态查找表
上面讨论的前提是每次查找都是“成功”的,但 实际上不一定对于给定的每个值都能找到相应的 记录,即会产生查找“不成功”的情况,如果查 找不成功的情形不容忽视时,查找算法平均查找 长度应是查找成功时的平均查找长度与查找不成 功时的平均查找长度之和。 假设查找成功和不成功的概率相等,即均为 1/2,则顺序查找的平均查找长度为:
key 4 0 1 8 2 mid=2 9 3 10 11 13 6 19 7
30
4 5 high=3
low=3(mid+1)
9.1 静态查找表
查找范围 :low(低下标)= 3; high(高下标)= 3 ;
high=3(mid-1)
查找范围 :low(低下标)= 1; high(高下标)= 3 ; 比较对象: mid = (low+high)/ 2 =2
key 4 0 1 low=1 8 2 mid=2 9 3 10 4 11 5 13 6 19 7
29
high=3(mid-1)
9.1 静态查找表
查找范围 :low(低下标)= 1; high(高下标)= 3 ; 比较对象: mid = (low+high)/ 2 =2
key 4 0 1 low=1 mid=2; 但 key=9 > 8, 向 右 8 9 10 11 13 2 3 4 5 6 high=3(mid-1) 19 7
查找范围:low(低下标)= 3; high(高下标)= 3;
“主关键字”:若此关键字可以识别唯一的一个 记录,则称之谓“主关键字”(如“学号”) “次关键字”:若此关键字能识别若干记录,则 称之谓“次关键字”(如“女”)
6
第九章
查
找
• 查找 根据给定的某个值,在查找表中确定一个其关键 字等于给定值的数据元素或(记录) 若查找表中存在这样一个记录,则称“查找成 功”,查找结果:给出整个记录的信息,或指示 该记录在查找表中的位置; 否则称“查找不成功”,查找结果:给出“空记 录”或“空指针”。
P 1
i 1 i
Ci为找到该记录时,曾和给定值比较过的关键字的 个数
23
讨论① 查不到怎么办?
——返回特殊标志,例如返回空记录或空指针。前例中设立了“哨
兵”,就是将关键字送入末地址ST.elem[0].key使之结束并返回 i=0。
讨论② 查找效率怎样计算?
——用平均查找长度ASL衡量。
讨论③ 如何计算ASL?
9
讨论:
(1)查找的过程是怎样的?
给定一个值K,在含有n个记录的文件中进行搜索,寻找 一个关键字值等于K的记录,如找到则输出该记录,否则输出 查找不成功的信息。
(2)对查找表常用的操作有哪些?
查询某个“特定的”数据元素是否在表中; 查询某个“特定的”数据元素的各种属性; 在查找表中插入一元素; 从查找表中删除一元素。
“特定的”=关键字
(3) 有哪些查找方法?
查找方法取决于表中数据的排列方式;
例如查字典
针对静态查找表和动态查找表的查找方法也有所不同。
10
如何评估查找方法的优劣?