收藏 分享(赏)

数据结构习题解析第10章.doc

上传人:gnk289057 文档编号:6179287 上传时间:2019-03-31 格式:DOC 页数:23 大小:337KB
下载 相关 举报
数据结构习题解析第10章.doc_第1页
第1页 / 共23页
数据结构习题解析第10章.doc_第2页
第2页 / 共23页
数据结构习题解析第10章.doc_第3页
第3页 / 共23页
数据结构习题解析第10章.doc_第4页
第4页 / 共23页
数据结构习题解析第10章.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、209第10 章 索引与散列一、复习要点索引结构和散列结构是用于外部搜索的搜索结构。数据在外存的组织即文件结构,主要分顺序、直接存取(散列)和索引文件。在这些文件组织中使用的主要是索引和散列方法。1、基本知识点要求掌握静态索引结构,包括线性索引、倒排索引、静态索引树的搜索和构造方法。掌握动态索引结构,包括B树的搜索、插入、删除,通过关键码个数估算B 树的高度的方法;B+ 树的搜索、插入与删除。掌握散列法,包括散列函数的构造、处理溢出的闭散列方法;处理溢出的开散列方法;散列表分析。二、难点与重点1、线性索引 密集索引、稀疏索引、索引表计算 基于属性查找建立倒排索引、单元式倒排表2、动态搜索树 平

2、衡的m路搜索树的定义、搜索算法 B树的定义、B树与平衡的m路搜索树的关系 B树的插入(包括结点分裂)、删除( 包括结点调整与合并 )方法 B树中结点个数与高度的关系 B+树的定义、搜索、插入与删除的方法3、散列表 散列函数的比较 装载因子 与平均搜索长度的关系,平均搜索长度的关系 表长m、表中已有数据对象个数 n和装载因子的关系 解决冲突的(闭散列)线性探查法的运用,平均探查次数的计算 线性探查法的删除问题、散列表类的设计中必须为各地址设置三个状态 线性探查法中的堆积聚集问题 解决冲突的(闭散列)双散列法的运用,平均探查次数计算 双散列法中再散列函数的设计要求与表长m 互质,为此m 设计为质数

3、较宜 解决冲突的(闭散列)二次散列法的运用,平均探查次数计算 注意:二次散列法中装载因子与表长m 的设置 解决冲突的(开散列)开散列法的运用,平均探查次数计算 由平均探查次数计算装载因子,再计算表大小的方法三、教材中习题的解析10-1 什么是静态索引结构?什么是动态索引结构?它们各有哪些优缺点?【解答】210静态索引结构指这种索引结构在初始创建,数据装入时就已经定型,而且在整个系统运行期间,树的结构不发生变化,只是数据在更新。动态索引结构是指在整个系统运行期间,树的结构随数据的增删及时调整,以保持最佳的搜索效率。静态索引结构的优点是结构定型,建立方法简单,存取方便;缺点是不利于更新,插入或删除

4、时效率低。动态索引结构的优点是在插入或删除时能够自动调整索引树结构,以保持最佳的搜索效率;缺点是实现算法复杂。10-2 设有10000个记录对象, 通过分块划分为若干子表并建立索引 , 那么为了提高搜索效率, 每一个子表的大小应设计为多大? 【解答】每个子表的大小 s = n = 10000 = 100 个记录对象。10-3如果一个磁盘页块大小为1024 (=1K) 字节,存储的每个记录对象需要占用16字节,其中关键码占4字节,其它数据占12字节。所有记录均已按关键码有序地存储在磁盘文件中,每个页块的第1个记录用于存放线性索引。另外在内存中开辟了256K字节的空间可用于存放线性索引。试问:(1

5、) 若将线性索引常驻内存,文件中最多可以存放多少个记录?( 每个索引项8字节,其中关键码4字节,地址4字节)(2) 如果使用二级索引,第二级索引占用1024字节(有128个索引项),这时文件中最多可以存放多少个记录?【解答】(1) 因为一个磁盘页块大小为1024字节,每个记录对象需要占用16字节,则每个页块可存放1024 / 16 = 64个记录,除第一个记录存储线性索引外,每个页块可存储63个记录对象。又因为在磁盘文件中所有记录对象按关键码有序存储,所以线性索引可以是稀疏索引,每一个索引项存放一个页块的最大关键码及该页块的地址。若线性索引常驻内存,那么它最多可存放256 * (1024 /

6、8 ) = 256 * 128 = 32768个索引项,文件中可存放 32768 * 63 = 2064384个记录对象。(2) 由于第二级索引占用 1024个字节,内存中还剩255K 字节用于第一级索引。第一级索引有255 * 128 = 32640个索引项,作为稀疏索引,每个索引项索引一个页块,则索引文件中可存放32640 * 63 = 2056320。 10-4 假设在数据库文件中的每一个记录是由占2个字节的整型数关键码和一个变长的数据字段组成。数据字段都是字符串。为了存放右面的那些记录,应如何组织线性索引?【解答】将所有字符串依加入的先后次序存放于一个连续的存储空间store中,这个空

7、间也叫做“堆” ,它是存放所有字符串的顺序文件。它有一个指针 free,指示在堆store中当前可存放数据的开始地址。初始时 free置为0,表示可从文件的0号位置开始存放。线性索引中每个索引项给出记录关键码,字符串在store中的起始地址和字符串的长度:397 Hello World!82 XYZ1038 This string is rather long1037 This is Shorter 42 ABC2222 Hello new World!211索引表ID 堆store 关键码 串长度 串起始地址 0 Hello World! XYZ This string is rather

8、long This 42 3 5682 3 12 is Shorter ABC Hello new World!397 12 01037 15 411038 26 152222 16 5910-5 设有一个职工文件: 记录地址 职工号 姓 名 性别 职 业 年龄 籍贯 月工资(元)10032 034 刘激扬 男 教 师 29 山东 720.0010068 064 蔡晓莉 女 教 师 32 辽宁 1200.0010104 073 朱 力 男 实验员 26 广东 480.0010140 081 洪 伟 男 教 师 36 北京 1400.0010176 092 卢声凯 男 教 师 28 湖北 720

9、.0010212 123 林德康 男 行政秘书 33 江西 480.0010248 140 熊南燕 女 教 师 27 上海 780.0010284 175 吕 颖 女 实验员 28 江苏 480.0010320 209 袁秋慧 女 教 师 24 广东 720.00其中,关键码为职工号。试根据此文件,对下列查询组织主索引和倒排索引,再写出搜索结果关键码。(1) 男性职工;(2) 月工资超过800元的职工;(3) 月工资超过平均工资的职工;(4) 职业为实验员和行政秘书的男性职工;(5) 男性教师或者年龄超过25岁且职业为实验员和教师的女性职工。【解答】主索引 月工资 倒排索引 职务 倒排索引 职

10、工号 记录地址 月工资 长度 指针 职务 长度 指针0 034 10032 480. 3 073 教师 6 0341 064 10068 123 0642 073 10104 175 0813 081 10140 720. 3 034 0924 092 10176 092 1405 123 10212 209 2096 140 10248 780. 1 140 实验员 2 0737 175 10284 1200. 1 064 1758 209 10320 1400. 1 081 行政秘书 1 123free212性别 倒排索引 年龄 倒排索引性别 长度 指针 年龄 长度 指针男 5 034 2

11、4 1 209073 26 1 073081 27 1 140092 28 2 092123 175女 4 064 29 1 034140 32 1 064175 33 1 123209 36 1 081搜索结果: (1) 男性职工 (搜索性别倒排索引):034, 073, 081, 092, 123(2) 月工资超过800元的职工 ( 搜索月工资倒排索引):064, 081(3) 月工资超过平均工资的职工( 搜索月工资倒排索引) 月平均工资776元:064, 081, 140(4) 职业为实验员和行政秘书的男性职工( 搜索职务和性别倒排索引):073, 123, 175 /表项分类 ( 活动

12、 / 空 / 删)HashTable ( ) : TableSize ( DefaultSize ) AllocateHt ( ); CurrentSize = 0; /构造函数HashTable ( ) delete ht; /析构函数219const HashTable /重载函数:表赋值7 int Find ( const Type /在散列表中搜索xint IsEmpty ( ) return !CurrentSize ? 1 : 0; /判散列表空否,空则返回1 private:struct HashEntry /散列表的表项定义Type Element; /表项的数据, 即表项的关

13、键码KindOfEntry info; /三种状态: Active, Empty, DeletedHashEntry ( ) : info (Empty ) /表项构造函数HashEntry ( const Type enum DefualtSize = 31; HashEntry *ht; /散列表存储数组int TableSize; /数组长度,是满足4k+3的质数,k是整数int CurrentSize; /已占据散列地址数目void AllocateHt ( ) ht = new HashEntryTableSize ; /为散列表分配存储空间;int FindPos ( const

14、Type /散列函数;template const HashTable TableSize = ht2.TableSize; AllocateHt ( ); /重新分配目标散列表存储空间for ( int i = 0; i int HashTable : Find ( const Type / i为探查次数int CurrentPos = h0 = HashPos ( x ); /利用散列函数计算x的散列地址while ( htCurrentPos.info != Empty /实现取模else CurrentPos = h0 - ( i -q ) * ( i - q );while ( Cu

15、rrentPos N 的质数,设N = 5if ( N % 2 = 0 ) N+; /偶数不是质数for ( ; !IsPrime (N); N += 2 ); /寻找质数return N;int IsPrime ( int N ) /测试N是否质数for ( int i = 3; i*i #include #include class HashTable /散列表类定义public:enum KindOfEntry Active, Empty, Deleted ; /表项分类 ( 活动 / 空 / 删)HashTable ( ) : TableSize ( DefaultSize ) ht

16、= new HashEntryTableSize; /构造函数HashTable ( ) delete ht; /析构函数221int Find-Ins ( const char * id ); /在散列表中搜索标识符idvoid HashSort ( );private:struct HashEntry /表项定义Type Element; /表项的数据, 即表项的关键码KindOfEntry info; /三种状态: Active, Empty, DeletedHashEntry ( ) : info (Empty ) /表项构造函数, 置空;HashEntry *ht; /散列表存储数组

17、int TableSize; /最大桶数int FindPos ( string s ) const return atoi (*s) - 32; /散列函数int HashTable : Find-Ins ( const char * id ) int i = FindPos ( id ), j = i; /i是计算出来的散列地址while ( htj.info != Empty /当做循环表处理, 找下一个空桶 if ( j = i ) return -TableSize; /转一圈回到开始点, 表已满, 失败if ( htj.info != Active ) /插入if ( j i )

18、while ( int k = j; k i; k- ) htk.Element = htk-1.Element; htk.info = htk-1.info; hti.Element = id; hti.info = Active; /插入 else HashEntry temp;temp.Element = htTableSize-1.Element; temp.info = htTableSize-1.info;while ( int k = TableSize-1; k i; k- ) htk.Element = htk-1.Element; htk.info = htk-1.info

19、; hti.Element = id; hti.info = Active; /插入while ( int k = j; k 0; k- ) htk.Element = htk-1.Element; htk.info = htk-1.info; ht0.Element = temp.Element; ht0.info = temp.info; return j;void HashTable : HashSort ( ) int n, i; char * str;cin n str;for ( i = 0; i str;for ( i = 0; i : HashSort ( int A , in

20、t n ) /散列法排序for ( int i = 0; i : HashSort ( int A ; int n ) ListPtr * p , *q; int i, bucket, k = 0;for ( i = 0; i key Ai ) /空同义词子表或*q的数据最小 q-link = htbucked; htbucked = q; else if ( p-link = NULL | p-link-key Ai ) q-link = p-link; p-link = q; else p-link-link = q; /同义词子表最多3个结点for ( i = 0; i key key;

21、 k+;p = p-link; 10-18 设有15000个记录需放在散列文件中,文件中每个桶内各页块采用链接方式连结,每个页块可存放30个记录。若采用按桶散列,且要求搜索到一个已有记录的平均读盘时间不超过1.5次,则该文件应设置多少个桶? 【解答】已知用开散列法(开散列)解决冲突,搜索成功的平均搜索长度为1+/21.5,解出2241,又= n / m = 15000 / 30 / m = 500 / m 1,m500。由此可知,该文件至少应设置 500个桶。10-19 用可扩充散列法组织文件时,若目录深度为d,指向某个页块的指针有n个,则该页块的局部深度有多大?【解答】 设页块的局部深度为d

22、,根据题意有n = 2 d-d,因此,d = d - log 2 n。10-20 设一组对象的关键码为 69, 115, 110, 255, 185, 143, 208, 96, 63, 175, 160, 99, 171, 137, 149, 229, 167, 121, 204, 52, 127, 57, 1040 。要求用散列函数将这些对象的关键码转换成二进制地址,存入用可扩充散列法组织的文件里。定义散列函数为hash(key) = key % 64, 二进制地址取6位。设每个页块可容纳4个对象。要求按10 .4节介绍的方法设置目录表的初始状态,使目录表的深度为3。然后按题中所给的顺序,

23、将各个对象插入的可扩充散列文件中。试画出每次页块分裂或目录扩充时的状态和文件的最后状态。【解答】hash(69) = 5(10) = 000101(2) hash(115) = 51(10) = 110011(2)hash(110) = 46(10) = 101110(2) hash(255) = 63(10) = 111111(2)hash(185) = 57(10) = 111001(2) hash(143) = 15(10) = 001111(2)hash(208) = 16(10) = 010000(2) hash(96) = 32(10) = 100000(2) hash(63) =

24、 63(10) = 111111(2) hash(175) = 47(10) = 101111(2)hash(160) = 32(10) = 100000(2) hash(99) = 35(10) = 100011(2)hash(171) = 43(10) = 101011(2) hash(137) = 9(10) = 001001(2)hash(149) = 21(10) = 010101(2) hash(229) = 37(10) = 100101(2)hash(167) = 39(10) = 101001(2) hash(121) = 57(10) = 111001(2)hash(204

25、) = 12(10) = 001100(2) hash(52) = 52(10) = 110100(2)根据题意,每个页块可容纳4个对象,为画图清晰起见仅给出前20个关键码插入后的结果。目录表的深度d = 3。01DicDepth = 169, 115, 110, 255PgDepth = 101DicDepth = 1110PgDepth = 1Depth = 1初态, 插入69, 115, 110, 255 插入185, 页块分裂69, 115, 255, 185PgDepth = 100011011DicDepth = 2插入143, 目录分裂, 插入208, 96, 6369, 185

26、, 208, 96PgDepth = 1Depth = 1110PgDepth = 2115, 255, 143, 63PgDepth = 2000001010011100101110111DicDepth = 369, 185, 208, 96PgDepth = 1Depth = 1110PgDepth = 2115, 63PgDepth = 3255, 143, 63, 175PgDepth = 3225插入175, 目录分裂226四、其他练习题10-21 判断下列各叙述的正误。正确的打“” ,错误的打“”。(1) 在索引顺序结构上实施分块搜索,在等概率情况下,其平均搜索长度不仅与子表个数

27、有关,而且与每一个子表中的对象个数有关。(2) 在索引顺序结构的搜索中,对索引表既可以采取顺序搜索,也可以采用折半搜索。(3) 在9阶B树中,除根以外其他非叶结点中的关键码个数不少于4。(4) 在9阶B树中,除根以外的任何一个非叶结点中的关键码个数均在59之间。(5) 对于B 树中任何一个非叶结点中的某个关键码k来说,比k 大的最小关键码和比k小的最大关000001010011100101110111DicDepth = 3208, 96, 160PgDepth = 2Depth = 1110PgDepth = 2115, 63, 99, 171PgDepth = 3255, 143, 63,

28、 175PgDepth = 369, 185, 137, 149PgDepth = 2Depth = 1插入160, 页块分裂, 插入99, 171, 137, 149000001010011100101110111DicDepth = 3208, 96, 160, 204PgDepth = 2Depth = 1110PgDepth = 2115, 63, 99, 171PgDepth = 3255, 143, 63, 175PgDepth = 369, 149, 229PgDepth = 3Depth = 1插入229, 页块分裂, 插入167, 121, 204185, 137, 167,

29、 121PgDepth = 3Depth = 1000001010011100101110111DicDepth = 3208, 96, 160PgDepth = 3Depth = 1110PgDepth = 2115, 63, 99, 171PgDepth = 3255, 143, 63, 175PgDepth = 369, 149, 229PgDepth = 3Depth = 1插入52, 页块分裂185, 137, 167, 121PgDepth = 3Depth = 1204, 52PgDepth = 3Depth = 1227键码一定都在叶结点中。(6) B树是一种动态索引结构, 它

30、既适用于随机搜索, 也适用于顺序搜索。(7) 理想情况下,在散列表中搜索一个元素的时间复杂度为O(1)。(8) 在散列法中,一个可用的散列函数必须保证绝对不产生冲突。(9) 在散列法中采取开散列(链地址)法来解决冲突时, 其装载因子的取值一定在(0,1)之间。(10) 在散列法中采取闭散列(开地址)法来解决冲突时, 一般不要立刻做物理删除, 否则在搜索时会发生错误。【解答】(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 10-22 单项选择题 在备选答案中只有一个是正确的, 将其选出并把它的标号写在题后的括号内(1) 在10阶B树中根结点所包含的关键码个数最多

31、为_,最少为_。A. 1 B. 2 C. 9 D. 10(2) 在一棵高度为h的B树中,叶结点处于第 _层,当向该 B树中插入一个新关键码时,为搜索插入位置需读取_个结点。A. h-1 B. h C. h+1 D. h+2(3) 当对一个线性表R60 进行索引顺序搜索(分块搜索)时,若共分成了10个子表,每个子表有6个表项。假定对索引表和数据子表都采用顺序搜索,则搜索每一个表项的平均搜索长度为_。A. 7 B. 8 C. 9 D. 10(4). 既希望较快的搜索又便于线性表动态变化的搜索方法是_。A. 顺序搜索 B. 折半搜索 C. 散列搜索 D. 索引顺序搜索 (5) 散列函数有共同的性质,

32、则函数值应当以_概率取其值域的每一个值。A. 最大 B. 最小C. 平均 D. 同等(6) 设散列地址空间为 0 m-1,k为表项的关键码,散列函数采用除留余数法,即Hash(k) = k % p。为了减少发生冲突的频率,一般取p为_。A. m B. 小于m 的最大质数C. 大于m的最小质数 D. 小于m的最大合数(7) 在采用开散列法解决冲突时,每一个散列地址所链接的同义词子表中各个表项的_相同。A. 关键码值 B. 元素值C. 散列地址 D. 含义(8) 解决散列法中出现的冲突问题常采用的方法是_ 。A. 数字分析法、除留余数法、平方取中法B. 数字分析法、除留余数法、线性探查法C. 数字

33、分析法、线性探查法、双散列法D. 线性探查法、双散列法、开散列法(9) 在闭散列表中,散列到同一个地址而引起的“堆积” 问题是由于_引起的。A. 同义词之间发生冲突228B. 非同义词之间发生冲突C. 同义词之间或非同义词之间发生冲突D. 散列表“溢出”(10) 采用线性探查法解决冲突时所产生的一系列后继散列地址_。A. 必须大于等于原散列地址B. 必须小于等于原散列地址C. 可以大于或小于但不等于原散列地址D. 对地址在何处没有限制。(11) 对包含n个元素的散列表进行搜索,平均搜索长度_ 。A. 为O(log 2n) B、为O(n)C. 不直接依赖于n D. 上述三者都不是【解答】(1)

34、C, A (2) B, C (3) C (4) D (5) D (6) B(7) A (8) D (9) B (10) C (11) C10-23 填空题(1) 在索引表中,每个索引项至少包含有_域和_ 域这两项。(2) 假定一个线性表为 12, 23, 74, 55, 63, 40, 82, 36 ,若按key % 3条件进行划分,使得同一余数的元素成为一个子表,则得到的三个子表分别为_、_和_。(3) 假定一个线性表为(”abcd”,”baabd”,”bcef”,”cfg”,”ahij”,”bkwte”,”ccdt”,”aayb”),若按照字符串的第一个字母进行划分,使得同一个字母被划分在

35、一个子表中,则得到的a,b,c 三个子表的长度分别为_、_和_。(4) 在索引表中,若一个索引项对应数据对象表中的一个表项,则称此索引为_索引,若对应数据对象表中的若干表项,则称此索引为_索引。(5) 假定对长度n = 100的线性表进行索引顺序搜索,并假定每个子表的长度均为 ,则进行索引顺序搜索的n平均搜索长度为_,时间复杂度为_。(6) 若对长度n = 10000的线性表进行二级索引存储,每级索引表中的索引项是下一级20个表项的索引,则一级索引表的长度为_,二级索引表的长度为_。(7) 假定要对长度n = 100的线性表进行散列存储,并采用开散列法处理冲突,则对于长度m = 20的散列表,

36、每个散列地址的同义词子表(单链表)的长度平均为_。(8) 在线性表的散列存储中,装载因子 又称为装载系数,若用m表示散列表的长度, n表示待散列存储的元素的个数,则 等于_。(9) 对于包含n个关键码的m阶B 树,其最小高度为_,最大高度为_。(10) 已知一棵3阶B树中含有50个关键码,则该树的最小高度为_,最大高度为_。(11) 在一棵m阶B树上,每个非根结点的关键码数最少为_ 个,最多为_个,其子树棵数最少为_,最多为_。229(12) 在一棵B 树中,所有叶结点都处在 _上,所有叶结点中空指针等于所有_总数加1。(13) 在对m阶B 树插入元素的过程中,每向一个结点插入一个关键码后,若

37、该结点的关键码个数等于_个,则必须把它分裂为_个结点。 (14) 在从m阶B 树删除关键码的过程中,当从一个结点中删除掉一个关键码后,所含关键码个数等于_个,并且它的左、右兄弟结点中的关键码个数均等于_,则必须进行结点合并。(15) 向一棵B_ 树插入关键码的过程中,若最终引起树根结点的分裂,则新树比原树的高度_。(16) 从一棵B 树删除关键码的过程中,若最终引起树根结点的合并,则新树比原树的高度_。【解答】(1) 关键码值, 子表地址域 (2) (12, 63, 36), (55, 40, 82), (23, 74)(3) 3, 3, 2 (4) 稠密, 稀疏(5) 11, O( ) (6

38、) 500, 25n(7) 5 (8) n/m(9) logm(n+1) , logm/2 ( (n+1)/2) (10) 4, 5(11) m/2-1, m-1, m/2 , m (12) 同一层, 关键码(13) m, 2 (14) m/2-2, m/2-1(15) 增1 (16) 减110-24请回答有关二次散列方的问题若用二次散列解决冲突,求下一个“空位”的探查序列为Hi = ( H0 + i2 ) % m, Hi = ( H0 - i2 ) % m, i = 1, 2, , m/2.其中,H 0是第一次求得的散列地址, Hi是第i次求得的散列地址,m是散列表的大小。 (1) 相邻的地

39、址H i与H i-1之间是什么关系?(2) 为保证散列地址序列的地址不会循而往复地重迭,m 应设为什么数?装载因子的取法如何?(3) 为保证在删除时不中断查找链,可对被删记录做逻辑删除。为此,每个散列表的表项有3个状态,除了Active(正在使用)和Deleted(删除)状态外,还应有一个什么状态?【解答】(1) , i = 1, 2, , m/2m%) 1i*2H ( m,%) 1i*2H ( 1)i1)i0)1i0)i (2) 表的大小m应为满足4k+3的整数,其中k是正整数。装载因子 0.5。(3) 散列表中每个表项有3个状态:Active(正在使用)、Deleted (删除)、Empt

40、y (空)。 10-25假定有一个100100的稀疏矩阵,其中1% 的元素为非零元素,现要求对其非零元素进行散列存储,使之能够按照元素的行、列值存取矩阵元素(即元素的行、列、值联合为元素230的关键字),试采用除留余数法构造散列函数和线性探查法处理冲突,分别写出建立散列表和查找散列表的算法。【解答】由题意可知,整个稀疏矩阵中非零元素的个数为100。为了散列存储这100个非零元素,需要使用一个作为散列表的一维数组,该数组中元素的类型应为:struct ElemType int row; /存储非零元素的行下标int col; /存储非零元素的列下标float val; /存储非零元素值;假定用H

41、Tm 表示这个散列表,其中m为散列表的长度,若取装载因子为0.8左右,则令m为127为宜(因127为质数)。按照题目要求,需根据稀疏矩阵元素的行下标和列下标存取散列表中的元素,所以每个元素的行下标和列下标同时为元素的关键字。假定用x表示一个非零元素,按除留余数法构造散列函数,并考虑尽量让得到的散列地址分布均匀,所以采用的散列函数为:Hash(x) = (13 * x.row + 17 * x.col ) % m根据以上分析,建立散列表的算法如下:int HashTable : : Create ( ) /根据稀疏矩阵中100个非零元素建立散列表int i, d, temp; ElemType

42、x;for ( i = 0; i x.row x.col x.val; /输入非零元素d = (13 * x.row + 17 * x.col ) % TableSize; /计算初始散列地址temp = d;while ( htd.val != 0 ) /线性探查存储位置/此循环条件也可用htd.row! = -1或htd.col != -1来代替d = (d+1) % TableSize;if ( d = temp ) return 0; /无插入位置返回0htd = x; /非零元素存入 下标d位置return 1; /全部元素插入成功后返回1在散列表上进行查找的算法如下:int HashTable : : Search ( int row, int col ) /采用与插入时使用的同一散列函数计算散列地址int d = ( 13*row + 17*col ) % TableSize;/采用线性探查法查找行、列下标分别为row和col的元素while ( htd.val != 0 ) /此循环条件也可用htd.row != -1或htd.col != -1来代替if ( htd.row = row /查找成功返回元素的下标else d = (d +1) % TableSize;if ( d = temp ) return -1;return -1; /查找失败返回-1

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 试题课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报