不妨看看遞歸吧。遞歸的代碼複雜度是很低的,非常簡潔,而且,函數調用只有一條指令,如果把函數調用的時間假設為與加法一樣的常數級別,那樣分析出來的時間複雜度就很不靠譜。對高級語言來說,很難根據源代碼判斷出形成的機器碼到底使用了多少指令的,一條C代碼指令與一條CPU指令很多時候不對等,除非我們非常熟悉編譯原理,很清楚每條C指令生成的機器碼是怎樣的,否則,單靠C代碼分析時間複雜度,沒多少意義。除了實際運行,沒有什麼辦法知道某個算法的真實效果,否則只能是想當然居多(即不能說沒有道理,但道理是有折扣的)。
最明顯的應該是vector標準容器和C動態數組的關係。按照C的慣常思維,事先給動態數組分配一定的空間,然後追加,效率是最高的,所以給vector做初始化時也應該事先給出一定的空間,但按照標準庫專家們的說法,其實效率最高的正確做法就是讓vector從空集合開始不斷push_back()添加元素,因為他們設計的方案就是這樣做才是最高效率的,而且這個容器的算法事實上比傳統C的數組算法快得多。但顯然無論是算法的實現代碼還是我們使用這個庫容器的代碼,也都較為複雜,甚至會覺得調用push_back()方法會有函數開銷,也覺得在循環中不斷求容器的size()尺寸會浪費時間而用一個變量把尺寸儲存起來,諸如此類的東西,其實似是而非。
我還是那句話,把精力耗費這些地方上面,屬於浪費。當然,個人愛好是沒什麼可指責的,喜歡就行,從中得到樂趣就行了。