讲座2-一维数组查找统计、应用举例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
位置的初始值记为-1。这种从头开始,逐一枚举的查找方法称为顺序查找法。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题2:查找x(2)
给定一列数组,在数组中查找数据x,如果x存在于数组中,则输出x的
个数,否则输出0。
例题分析: 本题和上题的区别在于数组中可能存在多个x,这时候不管有没有找到x,都需要将 数组完整地扫描一遍。初始时,记x的个数s为0,每找到一个x,则s++,扫描完毕
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数值统计 3、其他应用
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题6:转换二进制
众所周知,整数的十进制转换成二进制采用的是“除2取余,按权展开,
倒序排列”的方法。现给出一个十进制数,保证它在整数(integer) 范围内,请你将它转换成二进制数。
次数 1 2 3 4 5 6 7 8 9 10
猜数
提示
500
小
750
大
625
大
562
大
531
大
516
大
508
大
504
大
502
小
503
大
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
二分查找
如果待查找的元素是有序的,一般我们采用二分查找法来查找元素。
二分查找又称折半查找,其基本思想是:
1. 将n个元素分成大致相等的两部分,取a[n/2]与x做比较; 2. 如果x=a[n/2],则找到x,算法中止; 3. 如果x<a[n/2],则只要在数组a的左半部分查找x; 4. 如果x>a[n/2],则只要在数组a的右半部分查找x。
//如果left=right,表示没有找到。
//记住:right所在的位置是取不到的!
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
二分查找的平均查找长度
已知一个有序表为(13 18 24 35 47 50 62 83 90 155 134),当用
二分法查找算法进行元素搜索时,成功的平均查找长度是多少?
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题3:找出第二小的数(NOIP2014提高组初赛)
if (S[1] < S[2]) FirstMin = S[1], SecondMin = S[2]; else FirstMin = S[2], SecondMin = S[1]; 在最坏情况下,该算法需要做
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
1
11 21 31
2
12 22 32
3
13 23 33
4
14 24 34
5
15 25 35
6
16 26 36
7
17 27 37
8
18 28 38
9
19 29 39
10
20 30 40
41
ቤተ መጻሕፍቲ ባይዱ
42
43
44
45
46
47
48
49
JSOI2018江苏省信息学奥林匹克冬令营
例题9:猴子选大王
M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,
从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,如 此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。M和N由 键盘输入,打印出最后剩下的那只猴子的编号。
输入样例:8 3 输出样例:7
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题9:猴子选大王
例题分析:
有了数组工具,我们可以使用数组来模拟猴子选大王的过程。定义一个含m个元素的数 组monkey来记录猴子的状态。用元素下标代表猴子的编号,元素的值表示猴子的状态:
monkey[k]=0表示第k只猴子仍在圈中;monkey[k]=1则表示第k只猴子已经出圈。
后,输出s的值即可。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
平均查找长度
为确定元素在数组中的位置,关键字和给定值进行比较的比较次数的期望值称为查
找算法在查找成功时的平均查找长度(ASL)。对于含有n个数据元素的查找表,查
找成功的平均查找长度为:ASL=∑Ki / n (i=1,2,3,…,n), 其中Ki表示找到每个元 素的比较次数,以用顺序查找法查找n个元素为例,查找第一个元素需要比较1次, 查找第二个元素需要比较2次,……,查找第n个元素需要比较 n 次,所以:
(2) 求考试成绩平均分,并输出; (3) 枚举学生成绩,输出高于平均分的学生学号和成绩。
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
例题5:求众数
所谓众数,就是是一组数据中出现次数最多的数,比如,3 3 4 4 4 5 6 6 8 8 9 这
列数中,众数就是4。有时候,在一组数中有好几个众数。
程序采用模拟的方法,开始时设置报数变量k的值为0,当前报数猴子的编号变量p的初 值也置为0,如果当前猴子在圈中,则报数,当报数达到n时,对当前报数的猴子作出圈
处理,即monkey[p]置1,同时k清0,然后进行下一轮报数。报数过程循环m-1次,删
除m-1只猴子后,剩下的那只猴子就是选出的大王。
3、其他应用
例题分析:
本题采用模拟法拆数,依次将除2的余数放到数组中,然后按格式倒序输出就可以了。
方便起见,可以设置一个变量记录二进制数的长度。
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题7:素数回文数
如果一个数从左边读和右边读都是同一个数,就称为回文数,例如
686就是一个回文数。编程求10到1000内所有的既是回文数同时又是素数 的自然数。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题1:查找x(1)
给定一列数组,在数组中查找数据x,如果x存在于数组中,则输出x的
位置,否则输出-1。
例题分析: 本题采用枚举法,从数组的第一个元素开始逐一比较,查找当前元素是否和x相同, 如果相同,则记录当前元素的位置并退出循环,直至循环结束。方便起见,可以将
(
A. 2n
)次比较。
for (i = 3; i <=n; i++) if (S[1] < SecondMin) if (S[1] < FirstMin) SecondMin = FirstMin ,FirstMin = S[1] ; else SecondMin = S[1] ;
B. n-1
C. 2n-3 D. 2n-2
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
例题4:成绩统计
某班有n名学生参加考试,求考试成绩的平均分,并将高于平均 分的学生的学号(下标)和成绩输出。
例题分析: 平均分average可以用总分sum除以人数n求得。据此,程序可以分为以下几个部分:
(1) 读入人数及学生成绩,同时求得成绩总分;
第二讲 数组应用
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数值统计 3、其他应用
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
查找元素
在一列数组元素中按要求查找元素是数组应用中的基本操作,也是很
多较复杂题的重要组成部分。按照题目要求的不同,查找可以分为各
种不同种类,这里主要解决两类查找问题: 1. 查找确定的元素 2. 查找最大的元素
输入格式:
输入两行,第一行n,表示数的个数,n<10000;第二行n个数,用空格隔开。题目保 证第二行的n个数为正数,且不超过10000。 输出格式: 输出出现次数最多的数,和它的次数。如果这样的数有多个,按照从小到大的顺序依
次输出,中间用空格隔开。
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
例题2:找出第二小的数(NOIP2014提高组初赛)
输入是n个不等的数构成的数组S,输出S中第二小的数SecondMin。
例题分析: 找出第K小的数一般采用排序的思想解决问题。本题由于K的值比较特殊,借鉴打擂台的 思想,也可以高效地解决问题。算法设计如下: 1. 定义两个变量(擂台)FirstMin和SecondMin; 2. 比较s[1]和s[2]的值,较小数的放在FirstMin里,较大的数放在SecondMin里。 3. s[3]~s[n]逐一和两个变量比较。先和SecondMin比较,如果比SecondMin小,再 和FirstMin比较,用比较结果更新两个变量的值,直至n-2个数全部比较完毕。 4. 最后,SecondMin的值就是S中第二小的数。
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
参考程序段: memset(a, sizeof(a), 0); for (int i=2; i*i<=n; i++) if (a[i]==0) for (int j=2; i*j<=n; j++) a[i*j]=1;
3、其他应用
50
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
算法设计: 1. 初始化数组a的元素值都为0, 假设它们都是素数; 2. a[1]=0,1既不是素数,也不是合数; 3. 循环枚举2~sqrt(n)+1,如果当前的数没有被删除,它就是素数;如果当前数是素 数,则删除该素数的所有<=n的倍数,即令a[i]=1; 4. 循环枚举2~n,输出所有值为零的元素下标。
ASL=∑Ki / n = ((1+n)*n/2)/n = (1+n)/2
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
讨论:猜数
这是一个猜数游戏,一位同学默想一个小于1000的正整数,让另一个
同学去猜,然后给出大或者小的提示,采取什么样的策略才能让猜的
次数尽量少呢?
一般我们会采用二分的策略,假如要猜得的数是503,猜数过程如下:
5. 回到1,在新的区域里查找x。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
参考程序段
left=1; right=1000; k=0; while (left<right) { mid=(left+right)/2; k=++k; if (mid==x) break; else if (mid>x) right=mid; else left=mid+1; } cout<<k; //这里采取左闭右开的写法,即右边的数不在范围内
例题分析: 本题的算法思路分三步:1. 枚举10~1000以内所有的数;2. 判断当前枚举的数是不是 素数;3. 判断当前枚举的数是不是回文数。 判断素数的方法大家都会,判断回文数可以利用数组,先把整数一位位拆分成数字放到 数组中,然后用两个指针分置首尾,两端逐一比较,直至两个指针会合或者发现不同的 数。如果两个指针会合,说明这个数就是回文数。
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
输入格式:一个数n(1<n<1000000)
输出格式:以空格隔开的素数 输入样例:10 输出样例:2 3 5 7
例题分析: 判断一个数是否为素数一般用循环结构解决。求范围内的素数可以枚举范围内的每一个
数,判断它是否为素数。还有没有更高效的做法?
JSOI2018江苏省信息学奥林匹克冬令营
例题9:猴子选大王
参考程序段:
k=0; p=0; for (int i=1; i<=m-1; i++) { while (k<n) { p++; if (p>n) p=1; if (a[p]==0) k++; } a[p]=1; k=0; }
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数据统计 3、其他应用
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
数据统计
统计学是一门收集、处理、分析、解释数据并从数据中得出结论
的科学。常见的统计方式包括求总数、求平均数、求中位数、求众数
等。由于参与统计的数据通常比较多,所以数组是统计类题目里不可 或缺的工具。
例题5:求众数
例题分析:
如果把n个数逐一用数组保存后再处理,麻烦不说,还不好做。由于本题的数据范围不 是很大,我们可以用数组下标表示数据,而用数组元素的值来表示该数据的个数。算 法描述如下: 1. 读入所有数据,存储每一个数据出现的次数; 2. 循环枚举每一个数据,找出最大的次数; 3. 再次循环枚举,依次输出等于最大次数的数据。
分析:可以画一个表格模拟查找的过程。
下标 数值
0 13
4
1 18
3
2 24
2
3 35
4
4 47
3
5 50
1
6 62
4
7 83
3
8 90
2
9 10 155 134
4 3
查找
所以,总的查找次数是 1*1+2*2+3*4+4*4=33, 平均查找长度是 33/11。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营