LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 小劲鸭

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

[复制链接]
 楼主| 发表于 2004-6-25 06:21:45 | 显示全部楼层
粽子兄的倒让我想起了用black-red tree的办法, 其实也是O(logn)...可以考虑。。:p
AVL树操作起来颇麻烦, 最大的障碍就是每删除一个internal node就要reconstruct一次。。。到现在我都不太会用。
发表于 2004-6-25 07:21:02 | 显示全部楼层
black-red tree的办法无法想像怎么把最大/小值找出来,看到这题第一个想到的就是avl了,其实如果模块变得好的话,用c,avl还是很好实现的......
用java就不知道了,觉得不能用一个array来实现此类树......
 楼主| 发表于 2004-6-25 07:29:09 | 显示全部楼层
最初由 zonzi 发表
black-red tree的办法无法想像怎么把最大/小值找出来,看到这题第一个想到的就是avl了,其实如果模块变得好的话,用c,avl还是很好实现的......
用java就不知道了,觉得不能用一个array来实现此类树......


这倒好办, 做个class myAVL implements interface AVL, CLASS里面加个vector, 加个node就行了。
发表于 2004-6-25 07:31:41 | 显示全部楼层
最初由 小劲鸭 发表
这倒好办, 做个class myAVL implements interface AVL, CLASS里面加个vector, 加个node就行了。

也是,快用avl吧,不要忘记加个counter来记有多少次比较哦
发表于 2004-6-28 21:34:17 | 显示全部楼层

今天刚考完算法!


  1. /*
  2. * Created on 2004-6-26
  3. * MaxMin.java
  4. */

  5. /**
  6. * @author acdy
  7. * 算法 2.6 递归求取最大和最小元素
  8. */
  9. public class MaxMin {

  10.         private int n;
  11.         private double[] A;
  12.         private double fmax;
  13.         private double fmin;
  14.        
  15.         public MaxMin(double[] A) {
  16.                 this.A = A;
  17.                 n = A.length -1;
  18.         }
  19.         // 递归求取最大和最小元素
  20.         public void maxMin(int i,int j) {
  21.         // 把最大A(i,j)中的最大值和最小值分别赋给fmax和fmin
  22.                
  23.                 if(i==j) {
  24.                         fmax = fmin = A[i];
  25.                 }
  26.                 else if(i==j-1) {
  27.                         if(A[i]<A[j]) {
  28.                                 fmax = A[j];fmin = A[i];
  29.                         }
  30.                         else {
  31.                                 fmax = A[i];fmin = A[j];
  32.                         }
  33.                 }
  34.                 else {
  35.                         int mid = (int)Math.floor((i+j)/2);
  36.                         double gmax,gmin,hmax,hmin;
  37.                         maxMin(i,mid);
  38.                         gmax = fmax;
  39.                         gmin = fmin;
  40.                        
  41.                         maxMin(mid+1,j);
  42.                         hmax = fmax;
  43.                         hmin = fmin;
  44.                        
  45.                         fmax = Math.max(gmax,hmax);
  46.                         fmin = Math.min(gmin,hmin);
  47.                 }
  48.         }
  49.        
  50.         // 显示结果
  51.         public void print() {
  52.                 System.out.println("最大值为:\t"+ fmax);
  53.                 System.out.println("最小值为:\t"+ fmin);
  54.         }
  55.         public static void main(String[] args) {
  56.                 // 下标从一开始
  57.                 double[] A={0,22,13,-5,-8,15,60,17,31,47};
  58.                 // 初始化
  59.                 MaxMin test = new MaxMin(A);
  60.                
  61.                 // 递归求取最大和最小元素
  62.                 test.maxMin(1,A.length-1);
  63.                
  64.                 // 显示结果
  65.                 test.print();
  66.         }
  67. }
复制代码

需要比较的次数

T(n) =
0 (n=1)
1 (n=2)
T(floor(n/2))+T(ceil(n/2)) + 2 (n>2)

当n = 2 的幂时 T(n)=2T(n/2)+2 ;3n/2-2 是最好,平均及最坏情况的比较次数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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