信息学奥赛课课通第7单元第9课哈希表课件_第1页
信息学奥赛课课通第7单元第9课哈希表课件_第2页
信息学奥赛课课通第7单元第9课哈希表课件_第3页
信息学奥赛课课通第7单元第9课哈希表课件_第4页
信息学奥赛课课通第7单元第9课哈希表课件_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、例1、用哈希表存储以下线性表(18,75,60,43,54,90,46,问题分析: 假设选取的哈希函数为h(k)=k mod m,k为元素的关键字,m为哈希表的长度,用余数作为存储该元素的哈希地址。k和m均为正整数,并且m要大于或等于线性表的长度n。此例n=7,故取m=13就已经足够,得到的每个元素的哈希地址为: h(18)=18 mod 13=5 h(75)=75 mod 13=10 h(60)=60 mod 13=8 h(43)=43 mod 13=4 h(90)=90 mod 13=12 h(46)=46 mod 13=7,根据哈希地址,依次把元素存储到哈希表H(0m-1)中的效果如下,

2、当然,这是一个比较理想的情况,假如要再往表中插入第8个元素30,h(30)=30 mod 13=4,会发现H4已经存放了43,此时就发生了冲突,那么就可以从H4往后按顺序找一个空位置存放30,即可以把它插入到H6中,H,例2:分身数对。(sumx,1s,256MB,问题描述: 给出n个不同的正整数a1an,它们的值在11000000之间。再给定一个整数x,编程计算这样的数对个数(ai,aj),1=ij=n并且ai+aj=x,输入格式: 第1行1个正整数n,1=n=100000。 第2行n个正整数,表示元素a1an,每两个数之间用一个空格分隔。 第3行1个正整数x,1=x=2000000。 输出

3、格式: 1行,1个整数,表示这样的数对个数。 输入样例: 9 5 12 7 10 9 1 2 3 11 13 输出样例: 3,样例说明: 不同的和为13的数对是(12,1),(10,3)和(2,11)共3对。 问题分析: 如果使用双重循环来查找,本题是要超时的。用哈希表来处理,定义ax代表x这个数在数列中是否存在,1代表存在,0代表不存在,那么只需要扫描1x/2,若数字存在,那么只需要查看x减去这个数的结果在数列里是否存在,若存在就增加一对数列,例3:明明的随机数(noip2016普及组复赛,randam,1s,256MB,问题描述: 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观

4、性,他先用计算机生成了N个1到1000之间的随机整数(N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作,输入格式 输入有2行,第1行为1个正整数,表示所生成的随机数的个数N。 第2行有N个用空格隔开的正整数,为所产生的随机数。 输出格式 输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 样例输入 10 20 40 32 67 40 20 89 300 400 15 样例输

5、出 8 15 20 32 40 67 89 300 400,问题分析: 因为n=100,可以使用冒泡排序、插入排序、选择排序等时间复杂度为O(n2)的算法实现,这样做不会超时。实际上,对于产生的随机数ai,由于0ai1001,且ai为整数。所以,可以使用哈希表ai=0表示没有i这个数,ai=1表示有i这个数。那么,每次读一个i,把ai赋值为1,读完所有数据后,只要再扫描一下这个数组就可完成统计和排序输出任务。这种方法类似“桶排序”原理,练习1:整数集合(sumsets,1s,256MB,问题描述: 给定一个整数集合s,请你寻找一个最大的d,使得a+b+c=d,并且a、b、c、d都是集合中的元素

6、。 输入格式: 若干集合s。 对于每个集合s的第1行包含1个整数n,1=n=1000,表示集合中元素的个数。随后有n行,每一行一个整数,表示集合s中的元素,每个整数的范围是536870912,536870911. 输入的最后一行包含一个0。 输出格式: 对于每个集合s,输出一行一个整数d,或者“No Solution”表示无解,输入样例: 5 2 3 5 7 12 5 2 16 64 256 1024 0 输出样例: 12 No Solution,练习2:生日(birthday,1s,256MB,问题描述: 多多今天很高兴,因为他的好朋友苹果要过生日了。由于今天多多得到了两张价值不菲的SHOP

7、购物券,所以他决定买N件礼物送给苹果。 一个下午过去了,多多选好了N件礼物,并且它们的价格之和恰好为两张购物券的面额这和。当多多被自己的聪明所折服,高兴地去结账时,他突然发现SHOP对购物券的使用有非常严格的规定:一次只允许使用一张,不找零,不与现金混用。多多身上根本没有现金,并且他不愿意放弃挑选好的礼物。这就意味着,他只能通过这两张购物券结账,而且每一张购物券所购买的物品总价格,必须精确地等于这张购物券的面额。 怎样才能顺利地买回这N件礼物送给苹果呢?本题的任务就是帮助多多确定是否存在一个购买方案。已知其中一张购物券的面额以及所有商品的价格,只需要确定能否找到一种方案使得选出来的物品的价格总和正好是这张购物券的面额即可,输入格式: 有多组测试数据。每组数据的第一行为两个整数N和M,分别表示多多一共挑选了N个物品送给苹果以及多多的一张购物券的面额为M。接下来的一行有N个用空格隔开的正整数,第i个数表示第i个物品的价格。 输出格式: 包含若干行,每行一个单词“YES”或者“NO”,分别代表存在一个购买方案或不存在一个购买方案。 输入样例: 10 2000 1000 100 200 300 400 500 700 600 900 800 10 2290 1000 10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论