求助!三重for循环的优化!

tl2327 2013-09-16 09:45:02

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);
}
}
}


代码如上:
题目是金蝶的笔试题;
大概意思是:优化上面的代码,并给出理由~~~
小的菜鸟级别····不知从何下手!求大神出现解惑!!!
...全文
3586 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lili314428 2013-09-18
  • 打赏
  • 举报
回复
int i = 0; int j = 0; int k = 0; for (k = 0; k < 10; k++) { for (j = 0; j < 100; j++) { for (i = 0; i < 1000; i++) { function(i, j, k); } } }
追寻月亮 2013-09-18
  • 打赏
  • 举报
回复 1
写错一个地方,应该是

for (int i = 0, j = 0, k = 0; i < 1000; k++) {

			if (k >= 10) {
				k = 0;
				j++;
				if (j >= 100) {
					j = 0;
					i++;
				}
			}
			function(i,j,k);
		}
不过好像没快多少,呵呵,快了两秒而已
追寻月亮 2013-09-18
  • 打赏
  • 举报
回复 1

for (int i = 0,j=0,k=0; i < 1000&& j<100; j++) {
	if (j >= 100) {
		j = 0;
		i++;
		if (k >= 10) {
			k = 0;
			j++;
		}
		function(i, j, k);
         }
}
异常异长 2013-09-18
  • 打赏
  • 举报
回复
循环次数多的放到最外层 确实不错
  • 打赏
  • 举报
回复
厉害,涨见识了
yenshen 2013-09-18
  • 打赏
  • 举报
回复
引用 5 楼 xxcncsg 的回复:
不论是哪种方式,比较次数应该是一样的吧?
测试后发现4L的没错,他说的次数是指判断次数(判断是否满足循环条件)

public static void main(String[] args) {
	int x = 0;
	for (int i = 0; i < 2; i++) {
		System.out.println("compare i:" + i + "  " + ++x);
		for (int j = 0; j < 3; j++) {
			System.out.println("compare j:" + j + "  " + ++x);
			for (int k = 0; k < 4; k++) {
				System.out.println("compare k:" + k + "  " + ++x);
			}
		}
	}
	
	System.out.println();
	x = 0;
	
	for (int i = 0; i < 4; i++) {
		System.out.println("compare i:" + i + "  " + ++x);
		for (int j = 0; j < 3; j++) {
			System.out.println("compare j:" + j + "  " + ++x);
			for (int k = 0; k < 2; k++) {
				System.out.println("compare k:" + k + "  " + ++x);
			}
		}
	}
}
xxcncsg 2013-09-17
  • 打赏
  • 举报
回复
不论是哪种方式,比较次数应该是一样的吧?
lina791211 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 F2004 的回复:
引用 楼主 tl2327 的回复:
牛,这个就不属于改动代码了。时间复杂度没变,但是系统堆栈切换确实少了很多
lina791211 2013-09-17
  • 打赏
  • 举报
回复
11L我的代码,去掉注释就可以测试了。 最后的结果是一致的。 原题可能参考了 《编程珠玑》里面随机生成百万个数,并计算1KW内没有生成的值
lina791211 2013-09-17
  • 打赏
  • 举报
回复
先说理由。 在Java中,Integer.MAX_VALUE=2147483647 在本题中,三个数相乘的值 =1000000 明显要小很多哦。 所以直接上代码(代码是一个取巧的方法了,不过多了三次取模运算) 欢迎指评

package com.jindie;


/**
 * 优化下面的代码,并给出理由~
 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);
		 }
	 }
 }

 * @author SnowFigure
 *
 */
public class T201301 {
	private static int count = 0;
	private static void function(int i,int j,int k){
		count ++;
	}
	public static void main(String[] args) {
		int iMax = 1000;
		int jMax = 100;
		int kMax = 10;
		int t = iMax * jMax * kMax;
		
//		for(int i=0;i<t;i++){
//			function(t/1000,t/100000,t%1000000);
//		}
		
//		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);
//				 }
//			 }
//		 }
		System.out.println(count);
	}
}
欢迎指教
xiaxinhuo 2013-09-17
  • 打赏
  • 举报
回复
牛人啊,学习了!
xb12369 2013-09-17
  • 打赏
  • 举报
回复
长见识了
MC-热狗 2013-09-17
  • 打赏
  • 举报
回复
134楼大神 膜拜
tony4geek 2013-09-17
  • 打赏
  • 举报
回复
引用 3 楼 fudongrifdr 的回复:
减小了栈切换的频率
whos2002110 2013-09-17
  • 打赏
  • 举报
回复
引用 3 楼 fudongrifdr 的回复:
减小了栈切换的频率
测试确实如此,这个切换具体怎么讲?
有巢鱼 2013-09-16
  • 打赏
  • 举报
回复 1
引用 楼主 tl2327 的回复:

		 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);
				 }
			 }
		 }
不能光看function的执行次数,还要看i,j,k的比较次数。 i需要比较1000次,j需要比较1000*100次,k需要比较1000*100*10次。 总的比较次数是1000+1000*100+10*100*1000次

		 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);
				 }
			 }
		 }
上述代码中function执行次数一样, 但是k需要比较10次,j需要比较10*100次,i需要比较10*100*1000次。 总的比较次数是10+10*100+10*100*1000次 所以后面的代码比前面的代码少比较1000+1000*100-(10+10*100)次!
末日哥 2013-09-16
  • 打赏
  • 举报
回复
减小了栈切换的频率
tl2327 2013-09-16
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
循环数越多越放在里面层循环。
起初我也是这样想的,可是这样运算的次数是一样的!!还有这个优化的理由是??? 或者是这样做的原因是?
Inhibitory 2013-09-16
  • 打赏
  • 举报
回复
循环数越多越放在里面层循环。

81,116

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧