如果要求編程實現1+1的運算,速度最快的應該就是printf(“1+1=2”);
也許會說,這壓根不是程序算的,但如果你只想知道1+1的結果是什么,這個效率絕對是最優的。這里面就體現了編程里最基本的東西--效率。
比如,要求算1+2+3+...+n。
方法1,使用for,從1加到n;
方法2,利用遞歸。
那么考慮遞歸會導致嵌套調用,程序在運行時會多次入棧出棧保存或者恢復程序上下文,效率肯定不如for。
還有另外一種算法,就是利用公式(1+n)*n/2,不需要用到循環。那么sum可以寫成:
sum=n&0x1?((1+n)>>1)*n:(n>>1)*(n+1)
這里乘除法盡量轉化為移位操作,cpu處理邏輯運算,加法運算效率是最高的,所有的乘除操作,其實都是采用多次調用加法器來實現。
算法里面會用到時間復雜度O,描述了該算法的運行時間。針對上面的算法,使用for,其時間復雜度是O(n),利用公式,時間復雜度是O(1),就其算法復雜度來說,利用公式是優于使用for循環的。
一個需求,可能有無數個方法來滿足,如何選取一個最優的方法,就是展現程序設計能力的時候,這里的程序設計能力,包括軟件架構、數據結構、算法、數據存儲、系統級優化等。就上面這個例子來說,不涉及其他,只需要一個合適的算法就行,就現在的CPU能力來說,上面的幾種算法可能都體現不出來效率的差距,但是如果對象的范圍變大變廣,要處理海量的數據,那么,算法的不同,差距就會很明顯。