确定数组最大最小值
我在网上看了很久,发现居然没人和我的想法一样。我的这种方法是简便当中效率最高的。最优情况只要比较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次
[解决办法]