今天做项目时遇到一个for循环的嵌套问题,一个循环次数多,一个次数少,怎样设计效率较高.
想起以前笔试时遇到过这个问题,当时由于时间仓促,没有细想,今天在实际代码中遇到这么问题,于是动笔算了下.
设两个循环次数分别为m、n,m为一个很大的数,n为一个较小的数。假设在m循环中第i(0<i<=m)个,n循环中第j(0<j<=n)个退出
则大循环套小循环所需的运算次数y1=(i-1)*n+j;
小循环套大循环所需的运算次数y2=(j-1)*m+i;
令f(i,j)=y1-y2=(n-1)*i+(1-m)*j+m-n
当f(i,j)>0时,
由此我们可以得到函数图像
通过计算相应面积所占的比例,我们可以算出相应的概率:
p1为大循环套小循环运算次数比较多的概率
p2为小循环套大循环运算次数比较多的概率
令m=k*n,则上式变为:
我们假设n=10,则可以得到函数图像为
横坐标为k,蓝色为p1概率,黄色为p2概率,从图中可以看出,
当k=1时,即m=n时,两着效率一样;
当k>1时,即m>n时,大循环套小循环的运算次数比较多,
当k趋向正无穷时,大循环嵌套小循环和小循环嵌套大循环运算次数的比例为(n+1)/(n-1)
因此,我们可以得出结论,一般情况下,小循环放在大循环外面的效率比较高.
当然,这也不是绝对的,具体项目中,因为数据存储结构或者其他原因,也有可能导致大循环放在外面效率比较高.