数据结构“ 查找表”

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

岗哨R.item [0]的作用是:保证while 循环一定终止(即使查找不成功、即R 中无键值等于K的数据元素,当i=0时 循环终止条件"被迫"成立)。因此,不 必将"i>0"写入循环条件从而使循环条 件得到简化 (对比第2章定位算法 locate_sqlist)。有关测试表明:当 n≥1000时,进行一次查找所花费的时 间平均减少约一半。
给定的某个值K,在查找表中寻找一个
其键值等于K的数据元素。若找到一个
这样的数据元素,则查找成功,运算结
果为该数据元素在表中的位置;否则, 查找不成功,此时的运算结果为一个特 殊标志。
●查找表:具有同一类型的数据元素组成的集合。
●静态查找表包括下列三种基本运算: ①建表CREATE(ST), 其作用是生成一个由用户给
查找运算通常以"数据元素的键值与给定值的比较" 作为标准操作,也就是用"数据元素的键值与给定值 的比较次数"来作为查找算法的时间性能。上述比较 次数称为"查找长度"。显然,查找长度与键值等于给 定值K的元素在顺序表中的位置有关。 若顺序表中第n个元素的键值为K,则顺序查找算法 的查找长度为1;若第1个元素的键值为K,则查找长 度为n;若表中无键值等于K的元素(查找不成功),则 查找长度为n+1。可见差别很大。较合理的办法是以" 查找成功时的平均查找长度"(记为ASL)作为查找算法 时间性能的度量,其定义为:
6.3.1 二叉排序树
一棵二叉排序树(又称二叉查找树)或者是一棵 空树,或者是一棵同时满足下列条件的二叉树: 1.若它的左子树不空,则左子树上所有结点 的键值均小于它的根结点的键值; 2.若它的右子树不空,则右子树上所有结点 的键值均大于它的根结点的键值; 3.它的左、右子树也分别为二叉排序树。
37
6 51
7 60
8 88
9 93
low=1
low=1 mid=2
mid=5 hig=4
hig=9
ห้องสมุดไป่ตู้
low=3 hig=4 mid=3 low=4 hig=4 mid=4 hig=3 low=4
二分查找算法每进行一次键值与给定值的 比较,查找区间的长度至少减小为原来二分 之一(“二分查找”由此得名)。由此易推算出 二分查找的查找长度不超过 log2n」+1。
6.3
树表
前面所述的静态查找表所含数据元素(在检索 阶段内)是固定不变的。而动态查找表则不然,
其所含数据元素可以经插入、删除运算而不断
的改变。动态查找表的这种动态特性要求我们
采用灵活的存储表示方法来组织动态查找表中
的数据元素。
本节介绍几种用来表示动态查找表的树表(主
要是二叉排序树和平衡二叉排序树。
第6章
查找表
6.1 基本概念
●查找表是一种以集合为逻辑结构、以查找 为“核心”运算、同时包括其它运算的数据结 构。 6.1.1 集合的基本概念 ●集合:由任意一些可分辨的对象构成的整 体。例如,所有整数放在一起构成一个集合, 称为整数集。空集是不含任何元素的集合,记 为Φ。 ●在数据结构课程中,通常只考虑那些由具 有相同类型的数据元素构成的集合。
●动态查找表 包括①查找②读表元以及下 列三种基本运算: ③插入INSERT(ST,K),若ST中不存在关 键字值等于K的数据元素,则将一个关键字 值等于K的新数据元素插入到ST中。 ④删除DELETE(ST,K),当ST中存在关 键字值等于K的数据元素时,将其删除。 ⑤初始化INITIATE(ST),其作用是设置一 个空的动态查找表ST。 (动态查找表:除了对查找表进行查找操作 外,还能向表中插入数据元素,或删除表中 的数据元素,因而表可以被改变。)
1.二叉排序树上的查找 (1)若查找树为空,则查找失败; (2)若查找树非空,将给定值与查找树的 根结点关键码比较; (3)若相等,则查找成功;否则 ①若给定值小于根结点关键码,则继 续在左子树上进行查找; ②若给定值大于根结点关键码,则继 续在右子树上进行查找。
例如: 二叉排序树
50
0 1 2 3 4 5 6 7 8 9 10 11 12 13 18 7 14 18 21 23 29 31 35 38 42 46 49 52 R.n
顺序查找算法(顺序表采用普通数组形式) int search-sqtable(int item[ ], int n, int k ) { int i ; item[0] = k; /*在数组的低端设置监视哨 */ While (item[i]!=k) i--; /* 从后往前找 */ return i; /* 找不到时,i为0 */ }
6.2 静态查找表的实现 6.2.1 顺序表上的查找 ●静态查找表的顺序表的类型定义如下: #define maxsize 静态查找表的表长; typedef struct { keytype key; /*关键字*/ ... ... /*其它域*/ }rec; typedef struct { rec item[maxsize+1]; int n; /*最后一个数据元素的下标*/ }sqtable;
顺序查找算法 int search-sqtable( sqtable R, keytype K ) { R.item[0].key = K; /*设置岗哨*/ i = R.n; /*设置比较位置初值 */ While (R.item[i].key!=K) i--; /*未找到时修改比较位置继续查找*/ return (i); } k=18
●静态查找表中的数据元素存放在上述数组 的第1到第n个单元,第n+1到最后一个单元为 备用区。不同的是,这里多说明了一个单元 即第0个单元,该单元被用于设置"岗哨"以便 简化查找运算的实现。 在上述存储结构上实现查找运算的一种直 观方法是"顺序查找法":从表的第n个位置开 始,从后往前依次将各个位置上的数据元素 的键值与给定值K比较。若某个位置上的数据 元素的键值与K相等则查找成功,回送该位置 作为结果;若所有数据元素的键值均与K不等, 回送0,标记查找不成功。
n ASL=∑ PiCi i=1
●顺序查找算法的平均查找长度ASL: 查找成功: ASL =(n+1)/2
查找失败: ASL = n+1
可见,顺序查找算法时间复杂度为O(n)
6.2.2 有序表上的查找(二分查找)
●有序表:对于任何一个顺序表,若
其中的所有数据元素按键值的某种次
序(升序或降序)排列,则称为有序表。
二分查找算法中的变量含义:
low : 查找区间的下界;
hig: 查找区间的上界; mid=(low+hig)/2:区间的中间位置;
K :给定值 ( 如 K=18 )。
●二分查找算法如下:
int binsearch(sqtable R, keytype K) {low=1; hig=R.n; /*置查找区间初值*/ while(low<=hig) /*区间长度不为0时继续查找*/ {mid=(low+hig)/2; /*找出区间的中间位置*/ switch {case K==R.item[mid].key: return mid; case K<R.item[mid].key: hig=mid-1; break; /*调整到左半区*/ case k>R.item[mid.key: low=low+1; break /*调整到右半区*/ } } return(0); /*返回0,表示查找不成功*/ }
由于有序表中所有元素按键值递增的次序排 列,若将表中任一元素的键值R.item[i].key与 给定值K比较,可根据三种比较结果区分出三种 情况: ①R.item[i].key=K,查找成功,R.item[i] 即为待查元素; ②R.item[i].key>K,说明待查元素若在表中, 则一定排在R.item[i]之前; ③R.item[i].key<K,说明待查元素若在表中, 则一定排在R.item[i]之后。 因此,在一次比较之后,若沿未找到待查元 素,则可根据比较结果缩小进一步查找的区间。
定的若干数据元素组成的静态查找表ST。
②查找SEARCH(ST,K),若ST中存在关键字值 等于K的数据元素,运算结果为该数据元素在ST中 的位置;否则,运算结果为一特殊标志。 ③读表元GET(ST,pos),其运算结果是ST中
pos位置上的数据元素。
(静态查找表是仅对查找表进行查找操作,而不能 被改变的表。)
●二分查找法的基本思想:首先选取表中 间位置的元素,将其关键码与给定值进行比 较,若相等,则查找成功;若给定值比该关 键码小,则要找的元素一定在表的左半区, 则继续对左半区进行折半查找。若给定值比 该关键码大,则要找的元素一定在表的右半 区,则继续对右半区进行折半查找。如此递 推,直到查找成功或查找区间长度为0(查找 不成功)为止。
6.2.3 索引顺序表上的查找 索引顺序表是按索引存储方式构造的一种
存储结构。一个索引顺序表由两个部分组成:
一个顺序表和一个索引表。其中的顺序表在
组织形式上与普通的顺序表完全相同;而索
引表本身在组织形式上也是一个顺序表。索
引顺序表的特点表现为以下两个方面 :
①顺序表中的数据元素“按块有序”;
②索引表反映了这些“块”的有关特性。
所谓"按块有序"是指:顺序表中的数据元 素被划分成一些子表(块);并且对其中任意 两个相邻表来说,排在前面的子表中的任一 数据元素的键值小于排在后面的子表中的所 有数据元素的键值。 图6-1中的顺序表被分成三块:(22,12, 13,8,9,20),(33,42,44,38,24, 48,),(60,58,74,47,86,53),并且 它们中的数据元素是按块有序的(但每一块中 的数据元素不要求有序)。
索引表
块内最大键值 块起始位置 22 1 48 7 86 13
22 12 13 8 1 2 3 4
9 20 33 42 44 38 24 48 60 58 74 47 86 53 5 6 7 8 9 10 11 12 13 14 15 16 17 18
图6-1 索引顺序表示例
索引顺序表上的查找分两个阶段: ①确定待查元素所在的块; ②在块内查找待查的元素。 以6-1所示的索引顺序为例。假如给定K=24, 应先将K与索引表中的各个块内最大键值比较, 得知只能在第二块,然后在第二块中进行查找。 第二阶段只能采用顺序查找法,而第一阶段既 可采用顺序查找法,也可采取二分查找法(索 引表中的索引项按"块内最大键值"域的值有 序)。 索引顺序表上的上述查找方法称为分块查找。
21
6 23 32 33
51
85 60 65
图6-2 二叉排序树示例
例如:
55 42 10 45 66
63 90
58 67 70 83 98
不 是二叉排序树。
二叉排序树给查找运算的实现提供了 便利条件:在表示一棵二叉排序树的二 叉链表上,要找键值比某结点X的键值小 (大)的结点,只需通过结点X的左指针 (右指针)到它的左(右)子树中去找。 二叉排序树具有下述重要性质;中 根遍历一棵二叉排序树所得的结点访问 序列是键值的递增有序序列。
二分查找的平均查找长度为:
ASLb≈log2(n+1)-1
二分查找的时间复杂性为:
T(n)= O(log2 n)
由此可见,二分查找的时间性能比
顺序查找好。但二分查找要求以有序 表作为存储表示。当采用的存储结构 不是顺序表、或者表中元素未按键值 的次序(递增或递减)排列时,则不能 进行二分查找。而顺序查找则无此限 制。
K=18 (查找成功的例子)
0 1 15 2 17 3 18 4 22 5 35 mid=5 hig=4 6 51 7 60 8 88 9 93
low=1
low=1 mid=2
hig=9
low=3 hig=4 mid=3
K=20 (查找不成功的例子) 0 1 2 3 4 5 15 17 18 22 35
6.1.2
查找表的基本概念
●查找是一种常用运算,其功能是从大 量的数据元素中找出某个特定的数据元素。 ●标识数据元素的数据项称为关键字, 简称键。该数据项的值称为键值。 ●能够唯一地标识数据元素的关键字称 为主关键字。 ●不能唯一地标识数据元素的关键字称 为次关键字。
●查找运算的功能的确切表述:根据
相关文档
最新文档