最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
2013-01-25 14:20
134 查看
最大最小值给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。
划分把n个数均分为两半。
递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。
合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL; minRg。
程序如下。划分点为m = (l+r)/2,两个区间为[l,m]和[m+1,r](注意不是[l,m-1]和[m,r])
最简单的算法就是,线性扫描挨个比较。
如果只求一列数的最大值,那么分治法并不好。假如有8个元素,挨个比较的方法找出最大值,需要比较7次;用分治法,比较的次数仍然是7次。假如有16个元素,挨个比较的方法找出最大值,需要比较15次;用分治法,比较的次数仍然是15次。
如果同时求最大值和最小值,那么分治法和线性扫描都是O(n)的复杂度,但是分治法的比较次数比线性扫描要少。
具体分析见:http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/
用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。
划分把n个数均分为两半。
递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。
合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL; minRg。
程序如下。划分点为m = (l+r)/2,两个区间为[l,m]和[m+1,r](注意不是[l,m-1]和[m,r])
void minmax (int l , int r , int & min , int & max) { int minl , minr , maxl , maxr ; if(r == l){ max = min = a[l ]; } else if(r == l+1) { if(a[l] > a[r]) { max = a[l]; min = a[r]; } else { max = a[r]; min = a[l]; } } else { int m = (l+r) >> 1; minmax (l, m, minl, maxl ); minmax (m+1, r, minr, maxr); max = maxl > maxr ? maxl : maxr ; min = minl < minr ? minl : minr ; } }
最简单的算法就是,线性扫描挨个比较。
如果只求一列数的最大值,那么分治法并不好。假如有8个元素,挨个比较的方法找出最大值,需要比较7次;用分治法,比较的次数仍然是7次。假如有16个元素,挨个比较的方法找出最大值,需要比较15次;用分治法,比较的次数仍然是15次。
如果同时求最大值和最小值,那么分治法和线性扫描都是O(n)的复杂度,但是分治法的比较次数比线性扫描要少。
具体分析见:http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/
相关文章推荐
- 最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 给定n个数,要求比较次数1.5n同时找出最大值和最小值
- 求一个数组中的最大值和最小值,要求将比较次数减小至3N/2
- 笔试题&面试题:给定n个数,要求比较次数1.5n同时找出最大值和最小值
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 如何用最少的比较次数找出一个数列的最大和最小值
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 算法入门:最少比较次数求最大/最小/第二大元素
- 求数组中最大值和最小值 以及 求数组中最大值和次大值 最小比较次数
- 寻找矩阵中最大元素置中,最小四元素置边角 P279_1010 改进比较次数
- 求一组随机数中的最大最小值最少比较次数
- [算法导论]在一个数组中寻找最大值和最小值所需要进行比较的次数
- 关于在一个无序数组中的数求最大值和最小值的最小比较次数
- 将[1,n^2]区间内n^2个数字分别填充到n*n的矩阵里,要求任意两个相邻的数字的和,它们的最大值最小是多少?
- 笔试题&面试题:给定n个数,要求比較次数1.5n同一时候找出最大值和最小值
- 用最小的比较次数来得到,最大值和最小值
- 找出具有n个元素的集合中最大的两个元素,要求比较次数尽可能少(三种算法的思考)
- 试着用最小的比较次数去寻找数组中的最大值和最小值。
- 同时求最大最小值,总的比较次数至…