数据结构“查找表”分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
给定的某个值K,在查找表中寻找一个
其键值等于K的数据元素。若找到一个
这样的数据元素,则查找成功,运算结
果为该数据元素在表中的位置;否则, 查找不成功,此时的运算结果为一个特 殊标志。
●查找表:具有同一类型的数据元素组成的集合。
●静态查找表包括下列三种基本运算: ①建表CREATE(ST), 其作用是生成一个由用户给
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 */ }
定的若干数据元素组成的静态查找表ST。
②查找SEARCH(ST,K),若ST中存在关键字值 等于K的数据元素,运算结果为该数据元素在ST中 的位置;否则,运算结果为一特殊标志。 ③读表元GET(ST,pos),其运算结果是ST中
pos位置上的数据元素。
(静态查找表是仅对查找表进行查找操作,而不能 被改变的表。)
由于有序表中所有元素按键值递增的次序排 列,若将表中任一元素的键值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]之后。 因此,在一次比较之后,若沿未找到待查元 素,则可根据比较结果缩小进一步查找的区间。
●静态查找表中的数据元素存放在上述数组 的第1到第n个单元,第n+1到最后一个单元为 备用区。不同的是,这里多说明了一个单元 即第0个单元,该单元被用于设置"岗哨"以便 简化查找运算的实现。 在上述存储结构上实现查找运算的一种直 观方法是"顺序查找法":从表的第n个位置开 始,从后往前依次将各个位置上的数据元素 的键值与给定值K比较。若某个位置上的数据 元素的键值与K相等则查找成功,回送该位置 作为结果;若所有数据元素的键值均与K不等, 回送0,标记查找不成功。
顺序查找算法 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
6.1.2
查找表的基本概念
●查找是一种常用运算,其功能是从大 量的数据元素中找出某个特定的数据元素。 ●标识数据元素的数据项称为关键字, 简称键。该数据项的值称为键值。 ●能够唯一地标识数据元素的关键字称 为主关键字。 ●不能唯一地标识数据元素的关键字称 为次关键字。
●查找运算的功能的确切表述:根据
●动态查找表 包括①查找②读表元以及下 列三种基本运算: ③插入INSERT(ST,K),若ST中不存在关 键字值等于K的数据元素,则将一个关键字 值等于K的新数据元素插入到ST中。 ④删除DELETE(ST,K),当ST中存在关 键字值等于K的数据元素时,将其删除。 ⑤初始化INITIATE(ST),其作用是设置一 个空的动态查找表ST。 (动态查找表:除了对查找表进行查找操作 外,还能向表中插入数据元素,或删除表中 的数据元素,因而表可以被改变。)
n ASL=∑ PiCi i=1
●顺序查找算法的平均查找长度ASL: 查找成功: ASL =(n+1)/2
查找失败: ASL = n+1
可见,顺序查找算法时间复杂度为O(n)
6.2.2 有序表上的查找(二分查找)
●有序表:对于任何一个顺序表,若
其中的所有数据元素按键值的某种次
序(升序或降序)排列,则称为有序表。
岗哨R.item [0]的作用是:保证while 循环一定终止(即使查找不成功、即R 中无键值等于K的数据元素,当i=0时 循环终止条件"被迫"成立)。因此,不 必将"i>0"写入循环条件从而使循环条 件得到简化 (对比第2章定位算法 locate_sqlist)。有关测试表明:当 n≥1000时,进行一次查找所花费的时 间平均减少约一半。
6.2 静态查找表的实现 6.2.1 顺序表上的查找 ●静态查找表的顺序表的类型定义如下: #define maxsize 静态查找表的表长; typedef struct { keytype key; /*关键字*/ ... ... /*其它域*/ }rec; typedef struct { rec item[maxsize+1]; int n; /*最后一个数据元素的下标*/ }sqtable;
查找运算通常以"数据元素的键值与给定值的比较" 作为标准操作,也就是用"数据元素的键值与给定值 的比较次数"来作为查找算法的时间性能。上述比较 次数称为"查找长度"。显然,查找长度与键值等于给 定值K的元素在顺序表中的位置有关。 若顺序表中第n个元素的键值为K,则顺序查找算法 的查找长度为1;若第1个元素的键值为K,则查找长 度为n;若表中无键值等于K的元素(查找不成功),则 查找长度为n+1。可见差别很大。较合理的办法是以" 查找成功时的平均查找长度"(记为ASL)作为查找算法 时间性能的度量,其定义为:
第6章
查找表
6.1 基本概念
பைடு நூலகம்●查找表是一种以集合为逻辑结构、以查找 为“核心”运算、同时包括其它运算的数据结 构。 6.1.1 集合的基本概念 ●集合:由任意一些可分辨的对象构成的整 体。例如,所有整数放在一起构成一个集合, 称为整数集。空集是不含任何元素的集合,记 为Φ。 ●在数据结构课程中,通常只考虑那些由具 有相同类型的数据元素构成的集合。