for(int i = 0 ; i < 1000 ;i++){
for(int j = 0; i < 100; j++){
for(int k = 0;k < 10; k++ ){
fun(i,j,k);
}
}
}
今天笔试的时候遇到这么一道题目 说有上面这么循环嵌套 ,问怎么优化 并说明原因。
for(int j = 0; i < 100; j++){
for(int k = 0;k < 10; k++ ){
fun(i,j,k);
}
}
}
今天笔试的时候遇到这么一道题目 说有上面这么循环嵌套 ,问怎么优化 并说明原因。
for(int j=0;j <100;j++){
for(int i=0;i <1000;i++){
function(i,j,k);
}
}
}
这样是不是效率会好点
分析:
内大外小
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条语句 http://topic.csdn.net/u/20080430/17/1427f647-8f08-4a88-aded-5b0e87f2cc60.html
===============================
以上只是个人浅见。。如有异议,望少仍鸡蛋先。。
要看最后fun做了什么才能确定效率哪个高
int i =1000;
int j=100;
int k=10;
int i1=0;
int j1=0;
int k1=0;
for(int n=0;n<i*j*k;n++){
if(n>0){
if(n%(k*j) ==0){
i1++;
}
if(n%k==0){
j1++;
}
if(j1>=j){
j1=0;
}
if(k1>=k){
k1=0;
}
}
System.out.println("I= " +i1 +" J= "+j1 +" K=" +k1++);
}可以得到相同的结果,但发现性能好像没什么变化。。高手指教
System.out.println(System.currentTimeMillis()-startTime);
上面的帖子中,同样的代码,在IBM J9 1.5与IBM J9 1.6的jre中运行的结果是不一样的
对于这样的大循环,IBM J9 1.6比sun hotspot和oracle的jrockit jdk的速度都快,然而IBM J9 1.5的实现效率很差如果是c语言,这个问题倒是还可以给出个答案
for(int i = 0 ; i < 1000000 ;i++)
fun(i/1000%1000,i/10%100,i%10);
Quote=引用 2 楼 mythofking 的回复:]
下面内容是从另外一个帖子上看到的
分析:
内大外小
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*……
[/Quote]
* @param args
*/
public static void main(String[] args) {
int x = 0;
int y = 0;
for (int k = 0; k < 10; k++) {
for (int j = 0; j < 100; j++) {
for (int i = 0; i < 1000; i++) {
++x;
}
}
} for (int k = 0; k < 1000; k++) {
for (int j = 0; j < 100; j++) {
for (int i = 0; i < 10; i++) {
++y;
}
}
}
System.out.println("x=" + x);
System.out.println("y=" + y); }
}x=1000000
y=1000000
代码1:
for(int i = 0; i < 5000;i++){ if(a>10){
//
}
else{ }
}
代码2:
if(a>10){
for(int i = 0; i < 5000;i++){ }
}
else{
for(int i = 0; i < 5000;i++){ }
}
k初始化100*1000次
j初始化1000次
内大外小:
k初始化10*100
j初始化10次
很明显内大外小更好一些,在JAVA中所有的赋值语句、比较语句、++语句这些都会转换成进栈、出栈、比较、加等各种指令。
也就是说内小外大比内大外小多执行很多JVM指令(因为一个简单的int i,int j之类的变量声明,编译成JVM指令后,可不只是一条指令)。
以上代码可以优化成:int i=0;
int j=0;
int k=0;
for(i=0;i<10;i++){
for(j=0;j<100;j++){
for(k=0;k<1000;k++){
fun(i,j,k);
}
}
}fun()被调用的次数虽然相同,但不意味着程序的效率相同。发现问题,要多思考
就是.net来讲没有JVM
还是会有初始化变量时的占用内存-->释放内存的重复操作。
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
一共执行语句数,不太明白!
内大外小和内小外大,最终如果输入的次数应该是一样的吧,一共都是10*100*1000次?而您所说的共执行语句次数不太明白。大虾,请详细说明一下。谢谢啦!
i=1000
j=100
fun(i,j,k)当然如果从算法的角度应该是如何降低 时/空复杂度 没仔细看 就不写了