關於優化我雖然工作了2年,但是很慚愧的說我從來不曾重視過,直到昨天我空閒沒事看到一個題目,我們的老大說代碼可以更加優化,但是我很肯定的說這個就很優化了(PS:第一種就是我寫的);但是在和我們老大討論後得到如下的結果。
這是一個很經典,但是不難的問題。對於學習JS中for循環的理解還是非常經典的例子。
問題:請問有100件貨物,和100匹馬,其中大馬一匹可以駝3件貨物,青年馬一匹可以駝2件貨物,小馬駒2匹可以駝一件貨物,請問大馬、青年馬、小馬駒分別有多少隻?
話說這個題目並不難,但是大家有沒有想過這個題目我們在寫JS代碼的時候計算結果後,計算機運行了多少次呢?
下面給大家看一組數據如下:
第一種解法:
思路分析:
首先我們知道如果全部是大馬那麼最多有33只也就是i<=33;
青年的駿馬一匹可以拉2件貨物,那麼最多50只;
小馬駒兩匹可以拉一件貨物,但是馬一共有100只,那麼最多也就100只對吧;
貨物只有100件,所有的馬駒一共100匹,這是我們的判定條件。
var sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=50; j++){ for(var k=0; k<=100; k++){ sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大馬'+ i+ '只'+','+ '青年馬'+j+'只'+','+'小馬駒'+k+'只'+';'+'<br /><br />'); } } } }; document.write('第一次共計循環了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
輸出的結果如下一共七中答案:
大馬2只,青年馬30只,小馬駒68只;
大馬5只,青年馬25只,小馬駒70只;
大馬8只,青年馬20只,小馬駒72只;
大馬11只,青年馬15只,小馬駒74只;
大馬14只,青年馬10只,小馬駒76只;
大馬17只,青年馬5只,小馬駒78只;
大馬20只,青年馬0只,小馬駒80只;
第一次共計循環了175134次
第二種解法:
思路分析:
首先我們知道如果全部是大馬那麼最多有33只也就是i<=33;
這裏的思路我們發生了變化,因爲當執行完第一次的for語句後,那麼青年的馬匹最多就變成了 j<=(100-i*3)/2;
小馬駒兩只可以拉一件貨物,那麼第三層的for循環裏面我們根據上面兩層得知 k<=(100-i-j);
貨物只有100件,所有的馬駒一共100匹,這是我們的判定條件。
sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=(100-i*3)/2; j++){ for(var k=0; k<=(100-i-j); k++){ sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大馬'+ i+ '只'+','+ '青年馬'+j+'只'+','+'小馬駒'+k+'只'+';'+'<br /><br />'); } } } }; document.write('第二次次共計循環了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
輸出的結果如下:
大馬2只,青年馬30只,小馬駒68只;
大馬5只,青年馬25只,小馬駒70只;
大馬8只,青年馬20只,小馬駒72只;
大馬11只,青年馬15只,小馬駒74只;
大馬14只,青年馬10只,小馬駒76只;
大馬17只,青年馬5只,小馬駒78只;
大馬20只,青年馬0只,小馬駒80只;
第一次共計循環了64872次
第三種解法:
思路分析:
首先我們知道如果全部是大馬那麼最多有33只也就是i<=33;
這裏的思路我們發生了變化,因爲當執行完第一次的for語句後,那麼青年的馬匹最多就變成了 j<=(100-i*3)/2;
小夥伴們有沒有發現這裏少了一層for循環,因爲這裏我們已經確定了小馬駒的個數就是 k=100-i-j 凡是不符合的直接跳過了;
貨物只有100件,所有的馬駒一共100匹,這是我們的判定條件。
sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=(100-i*3)/2; j++){ k=100-i-j; sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大馬'+ i+ '只'+','+ '青年馬'+j+'只'+','+'小馬駒'+k+'只'+';'+'<br /><br />'); } } }; document.write('第二次次共計循環了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
輸出的結果如下:
大馬2只,青年馬30只,小馬駒68只;
大馬5只,青年馬25只,小馬駒70只;
大馬8只,青年馬20只,小馬駒72只;
大馬11只,青年馬15只,小馬駒74只;
大馬14只,青年馬10只,小馬駒76只;
大馬17只,青年馬5只,小馬駒78只;
大馬20只,青年馬0只,小馬駒80只;
第一次共計循環了884次
代碼經多後面兩次改造,循環的次數直接差了190多倍。很驚訝吧。可以想象一下如果是數據量很大的情況下,代碼如此優化是不是在運行速度上帶來很大的提升呢。問題雖然簡單,但是給我們一個很明確的提示就是代碼的優化在性能上提升的速度不可小覷。
PS: 也許小夥伴有更厲害的優化方法,期待你們的答案。
========================================================
小月博客
WEB
========================================================