首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

确定数组最大最小值解决方法

2013-10-23 
确定数组最大最小值我在网上看了很久,发现居然没人和我的想法一样。我的这种方法是简便当中效率最高的。最优

确定数组最大最小值
  我在网上看了很久,发现居然没人和我的想法一样。我的这种方法是简便当中效率最高的。最优情况只要比较n次,最坏是2n次但是期望是1.5n, 虽然很简单,比什么分治法简单百倍,但能达到这种效果我认为值的在这说下。
假定数组保存在A[0~n]内,伪代码如下:

1.max=A[0]
2.min=A[0]
3.for i from 1 to n
4.{
5.   if max<A[i]
6.      max=A[i]
7.   else
8.      if min>A[i]
9.         min=A[i]
10.}

因为A[i]>max就意味着一定大于min了,这种方法就是用这个思想减少比较。很明显,期望的比较次数是1.5次,这应该是这个问题的最好解法。因为满足了效率、简洁的要求。分治法应该不比这个快,因为分治法减少的只是比较时间,而max、min数组赋值等等都额外消耗时间。最重要的是,这个方法代码量很少很简单。



数组最大最小值 最优方法 非分治 期望1.5n次比较
[解决办法]
分组算法:
1. 将整个数组拆分为两组,大数组max[],小数组min[],需要比较0.5n次
2. 在大数组max[]中找最大数,需要比较0.5n次
3. 在小数组min[]中找最小数,需要比较0.5n次
总共只需比较1.5n次

分治算法:
1. 分治可以把整个数组构造为一颗二叉树
2. 叶子节点需要的比较1次,有0.5n个叶子节点,比较次数为0.5n次
3. 非叶子节点需要比较2次,分别比较出该节点的最大值和最小值,有0.5n个非叶子节点,比较次数为n次
总共只需比较1.5n次
[解决办法]

引用:
分治法怎么可能只要1.5n,那是说比较次数而言,我们看的是整体效率,而不仅仅是比较吧。我今天又想了想,我弄错了,我的代码中第五行if(max<min[i]) 的概率不是一直是1/2的,是一直在减少的,所以期望高于1.5次比较。
另外,我认为代码简洁很重要可以这样写:
1.max=A[0]
2.min=A[0]
3.for(i=0;i<n;i+=2)
4.{
5.   if (A[i]<A[i+1])
6.      if(max<A[i])
7.          max=A[i]
7.   else
8.      if(min>A[i])
9.         min=A[i]
10.}
  这是听外国公开课里说的,网上看的分治法太弱了,还分配什么数组,用什么递归,那得多慢啊。而我昨天发的帖是我脑子突然不灵了吧。上面的代码才是正解,1.5n稳定比较次数。虽然上面代码没考虑数组数据的奇偶,但分治思想出来了。
这个思路是对的,当时代码是错的。

热点排行