日历

2008 8.21 Thu
     12
3456789
10111213141516
17181920212223
24252627282930
31      
«» 2008 - 8 «»

文章搜索

日志文章

2007年03月19日 09:36:28

浅谈算法的分析( 2 )

  算法的优化
经过一周的课程设计,对算法又有了一点新的认识,好的算法可以提高程序的运行效率,减少时间和空间复杂度。
  比如数组的移位问题,如果有一个长度为1000的数组,如果想将其左移100位。按正常的算法,数组只能先向左移动一位,然后重复一百次
这样的操作。因为数组只能借助中间变量来保存一个数组元素,然后依次向作移动
  其代码形式如下:
  class test1{
     static int a[] = new int[1000];
     static int number = 0;
     public static void set(){
           for(int k=0;k<1000;k++,number++){
                 a[k] = number;
           }
     }
     
     public static void main(String args[]){
           set();
           int middle;
           print();

           for(int i=0;i<100;i++){
                 middle = a[0];
                 for(int j=1;j<1000;j++){
                       a[j-1]=a[j];
                 }
                 a[999] = middle;
           }
           print();
     }
     public static void print(){
           for(int i=0;i<1000;i++){
                 System.out.print(a+" ");
           }
           System.out.println();
     }
  }
  其中算法的核心部分,亦即
           for(int i=0;i<100;i++){
                 middle = a[0];
                 for(int j=1;j<1000;j++){
                       a[j-1]=a[j];
                 }
                 a[999] = middle;
           }
  的时间复杂度是O(n*n),而如果采用下面的方法,时间复杂度会大大降低。
  第一步:将数组前100个元素逆置。这样原数组就变成了a[99]~a[0],a[100]~a[999]。
  第二步:将数组后900个元素逆置。原数组变成a[99]~a[0],a[999]~a[100]。
  第三步:将整个数组全部逆置。数组就变成了a[100]~a[999],a[0]~a[99]的形式。即移位完成。
  其代码形式如下:
  class Converse{
           void L_Converse(int a[],int 1000,int 100){
                 Reverse(a,0,100);
                 Reverse(a,100,1000);
                 Reverse(a,0,1000);
           }
           private void Reverse(int a[],int from,int to){
                 int middle;
                 for(int i=0;i<(to-from+1)/2;i++){
                       middle=a[from+i];
                       a[from+i]=a[to-i-1];
                       a[to-i-1]=middle;
                 }
           }
  }
  可以用上面的代码替换第一种代码的核心部分,这样时间复杂为O(3*n),也就是O(n),这样时间复杂度大大降低。所以好的算法可以大大提高程序的性能。
  可以试想一个10000个元素甚至更多个元素的数组,若其中的元素也不是整形的,那么算法优化的意义就更大了。

Tags: 优化  

类别: 无分类 |  评论(3) |  浏览(3684) |  收藏
一共有 3 条评论
3楼 ㄚǒμ@nd M 2007年03月21日 13:13:47 Says:
哎 什么时候也能自己写篇关于学习的 文章啊 ~!~
2楼 千羽朝凰 2007年03月21日 09:31:48 Says:
很不错吗?   以后就请多多指教啊!!!
1楼 chenmh 2007年03月20日 15:15:11 Says:
虽然臭小子总欺负我,不过从你身上确实能收到很多东西,说的对,不应该做什么只应付就了事,应该明白个所以然,呵呵.
发表评论