LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1594|回复: 14

[讨论]如何写出只要用小过三次的LOOP就能找到最大值和最小值

[复制链接]
发表于 2004-6-22 20:23:28 | 显示全部楼层 |阅读模式
在书上找了一个问题,想了半天还是不得其解, 看看大家怎么想:

有个整数array, A[],有n个整数值。 现在想一个algorithm 用来找出这个array里的最大值和最小值, 但要求这个algorithm的最大comparisons的数必须小于3n/2, 换句话说, 如果你是用for (int i = 0; i < n; i++)就不行, 因为你最多用了n次比较, 如果是三个loop的话, 就是3n了, 这就违反了这个条件, 我看看书上给的提示是将这个array分成两个, 从A[0 -> 2/n - 1]是Amin[]; 而从A[2/n -> n - 1] 是Amax[]; 这样用loop解决就是n/2了, 但这给出个最大值, 即是只能用2次或者1次loop就要将这两个ARRAY里的最大值和最小值找到, 最后在互相对比, 选出A[]里面的最大值和最小值, 不知道有没有人有些方案呢?
发表于 2004-6-22 21:01:40 | 显示全部楼层
it needs use "loop"...

int A[]=new int[100];
Arrays.sort(A);

A[0] is the min
A[99] is the max
 楼主| 发表于 2004-6-22 21:09:49 | 显示全部楼层
传统的方法我知道, 但怎么才能用少于三个LOOP来完成这个才是问题的关键。。
发表于 2004-6-22 21:39:27 | 显示全部楼层
最初由 小劲鸭 发表
传统的方法我知道, 但怎么才能用少于三个LOOP来完成这个才是问题的关键。。


n个数,每两个数一组,比较n/2次,比较结果的胜者再每两个一组比较n/4次,比较结果的负者也继续每两个一组比较n/4次,然后是n/8次....,总比较次数

n/2 + n/4 * 2 + n/8 * 2 + n/16 * 2 + ....  
=
n + n/4 + n/8 + 16/n + ....
结果收敛于 3n/2
发表于 2004-6-23 00:08:06 | 显示全部楼层
看来要好好学习数学啊!
 楼主| 发表于 2004-6-23 06:27:27 | 显示全部楼层
最初由 luma 发表
n个数,每两个数一组,比较n/2次,比较结果的胜者再每两个一组比较n/4次,比较结果的负者也继续每两个一组比较n/4次,然后是n/8次....,总比较次数

n/2 + n/4 * 2 + n/8 * 2 + n/16 * 2 + ....  
=
n + n/4 + n/8 + 16/n + ....
结果收敛于 3n/2


哇, 这个强,这都给你想到, 厉害。。。:p
发表于 2004-6-23 12:28:37 | 显示全部楼层
分组排序,。。。
交换,冒泡,二叉树,。。。
这样啊,,,这种算法可以写一本书了。。。
<数据结构和算法>现在有用java语言描述的。。。
 楼主| 发表于 2004-6-23 12:51:28 | 显示全部楼层
最初由 hantsy 发表
分组排序,。。。
交换,冒泡,二叉树,。。。
这样啊,,,这种算法可以写一本书了。。。
<数据结构和算法>现在有用java语言描述的。。。


理论上insertion and bubble sort 的最大比较是 O(n^2), 而binary tree 即是heap sort的最大比较是 O(nlogn)

他们都没办法实现小于3n/2的,只有luma兄的办法好像可以说
发表于 2004-6-23 15:59:43 | 显示全部楼层
呵呵,这个只是找到最大最小值,不需要排序的,自然时间复杂度可以小于nlog(n)
发表于 2004-6-25 04:16:50 | 显示全部楼层
avl树呢?其实也不用平衡树,只要不平衡的"avl"就够了
最大值=最右边的叶子
最小值=最左边的叶子
谁能告诉我怎么用java来做树呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表