金蝶的面试题
现有代码
for( int i=0;i<1000;i++){
    for(int j=0;j<100;j++){
       for(int k=0;k<10;k++){
                function(i,j,k);
        }
    }

有没有办法优化下,
我写的是把循环次数少的层放到外边,好像没意义呀

解决方案 »

  1.   

    int a = 0, b = 0, c = 0;
    for (int i = 1000; i > 0; i--, a++) {
       for (int j = 100; j > 0; j--, b++) {
          for (int k = 10; k > 0; k--, c++) {
             function(a, b, c);
          }
       }
    }减运算是不是比加要快?
      

  2.   

    那就这样        for(int i=1000;i>0;i--){
                for(int j=100;j>0;j--){
                    for(int k=10;k>0;k--){
                       function(i,j,k); 
                    }
                }
            }试了一下确实有点效果
    不过下面的好像也有效果
            for(int i=10;i>0;i--){
                for(int j=100;j>0;j--){
                    for(int k=1000;k>0;k--){
                       function(i,j,k); 
                    }
                }
            }
      

  3.   

    通过函数的嵌套调用来解循环的嵌套。 public void  f3(){
    for (int i = 0; i<1000; i++){
    f2(i);
    }

    }


    public void f2(int i){
        for (int j = 0; j<100; j++){
         f1(j);
        }

    }

    public void f1(int j){
    for (int k = 0; k<10; k++){
     function(i,j,k); 
     

    }
    }
      

  4.   

    把循环次数最多的放在循环的最内层
    效率会相应提高的for( int k=0;i <10;k++){ 
        for(int j=0;j <100;j++){ 
           for(int i=0;i <1000;i++){ 
                    function(i,j,k); 
            } 
        } 
    }  
    这样的话
    结果不会受到什么影响的
    但是效率会相应的提高
      

  5.   


    分析:
        内大外小
        for( int k=0;k <10;k++){ 
          for(int j=0;j <100;j++){ 
            for(int i=0;i <1000;i++){ 
                    function(i,j,k); 
            } 
          } 
        }  
         k<10;k++;     执行10次
         j<100;j++     执行10*100次
         i<1000;i++     执行10*100*1000次
         function(i,j,k); 执行10*100*1000次
         共执行语句数=(10+10*100+10*100*1000)*2+10*100*1000=3002020
        内小外大
        for( int k=0;k <1000;k++){ 
          for(int j=0;j <100;j++){ 
            for(int i=0;i <10;i++){ 
                    function(i,j,k); 
            } 
          } 
        }  
         k<1000;k++;  执行1000次
         j<100;j++     执行1000*100次
         i<10;i++      执行10*100*1000次
         function(i,j,k); 执行10*100*1000次
         共执行语句数=(1000+1000*100+10*100*1000)*2+10*100*1000=3202000所以执行效率应该是内大外小更高一写
                        内小外大-内大外小=3202000条语句-3002020条语句=199980条语句