算法入门:最少比较次数求最大/最小/第二大元素
2017-10-15 06:18
861 查看
本文将解决三个问题:
input:A[1……n] 包含n个数字
output:
- A的最大值max
- A的最大值max和最小值min
- A的最大值max和第二大值
要求:比较的次数尽可能少
对于每一对A[i]和A[i+1],要比较3次,总共有n/2对,所以比较次数是3/2n。
建立一个vector B来存储被击败的数字。它是一个链表,每个元素是一个数组,用来存储当前索引位置的元素击败过的数字,注意是把loser放到B中winner对应的坐标的位置。比如4,2,45,9四个数字,第一次比较2是loser所以把2放进B[1]的位置,1是winner 4的坐标。
这个图会比较清楚:
最后在主函数中:
input:A[1……n] 包含n个数字
output:
- A的最大值max
- A的最大值max和最小值min
- A的最大值max和第二大值
要求:比较的次数尽可能少
1.最大元素
如果使用排序的话,常见排序中比较快的有快速排序O(nlogn)。但是显然做一个线性遍历更加快。linear scan的时间复杂度为O(n) 。max = A[1]; for i=2 to n if max < A[i] max = A[i]; return max
2.最大元素和最小元素
值得注意的是这里要求的是比较次数尽可能少,如果做两次linear scan的话是需要2n次比较的,如果使用下面这种方法的话可以将比较次数降低至3/2n。min = A[1]; max = A[2]; for i = 1 to n if A[i] < A[i+1] if max < A[i+1] max = A[i+1]; if min > A[i] min = A[i];
对于每一对A[i]和A[i+1],要比较3次,总共有n/2对,所以比较次数是3/2n。
3.求最大元素和第二大元素
如果使用线性扫描的话还是要比较2n次,第一次找最大值,再在剩下的元素中找最大值作为整体的第二大值。这里有一种方法是:在2中假设最大元素为max,将所有与max进行过比较的数字拿出来找最大值,也就是整体的第二大值。建立一个vector B来存储被击败的数字。它是一个链表,每个元素是一个数组,用来存储当前索引位置的元素击败过的数字,注意是把loser放到B中winner对应的坐标的位置。比如4,2,45,9四个数字,第一次比较2是loser所以把2放进B[1]的位置,1是winner 4的坐标。
这个图会比较清楚:
max(A,i,j) { if i = j return i; else mid = ⌊(i+j)/2⌋; // 向下取整 a = max(A,i,mid);// 递归 b = max(A,mid+1,j); if A[a]>A[b] insert A[b] into B[a]; return a; if A[a]<A[b] insert A[a] into B[b]; return b; }
最后在主函数中:
main() { i = max(A,1,n); traverse B[i] to find the secondMax; return A[i],secondMax }
相关文章推荐
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- [BUC-2.10]利用分治的思想求无序数组中的最大值和最小值以及求第二大的值(分治的思想可以使得比较的次数1.5N-2)
- 寻找矩阵中最大元素置中,最小四元素置边角 P279_1010 改进比较次数
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 找出具有n个元素的集合中最大的两个元素,要求比较次数尽可能少(三种算法的思考)
- 同时需找最小最大元素(只需要3[N/2]次比较)
- 最大流最小割算法入门理解
- 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。
- 用HashMap实现args参数中的元素每个元素出现的次数以及出现的最大次数和最小次数
- 求数组中最大值和最小值 以及 求数组中最大值和次大值 最小比较次数
- 最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
- 找出数据集合中的最小值和最大值的两种算法比较
- C之算法--比较两个最大/最小数和9*9乘法口诀
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- 同时寻找最大数和最小数的最优算法 第二大数
- 求一个数组中的最大值和最小值,要求将比较次数减小至3N/2
- 10000亿数据寻找 最大 或者最小 n个 数 各种算法比较
- 算法笔记04--分治法之寻找最大最小元素