我們假設有一臺執行速度足夠快,記憶體足夠大的電腦(突破普朗克常量物理極限,達到數學層面的無限),快到可以瞬間做完任何任務,大到可以塞下任何程式棧,那麼我們從此似乎不再需要繼續鑽研資料結構和演算法了,暴力求解,暴力遞迴就是一切,顯然,這樣的電腦是不存在的。
舉這個例子就是想說明:資料結構和演算法問題必須放在具體時空條件下,具體情況具體分析,所以我們愛用最佳化這個詞,我們傾向於用更少的空間,更少的時間,做更多的計算,理論上軟體最佳化是有極限的,因為總要給磁碟,記憶體,cpu 物理工作的時間。
我們碰到的問題無非是在受限的時空條件下,完成目標的計算任務,或是基於源程式做定向最佳化。
定標準看起來是一件比較容易的事:
時間嘛,看程式執行多少毫秒就完事了,快就是好。
空間嘛,看佔了多少 bit,少就是好。
似乎很有道理,仔細琢磨一下有這樣一個問題:
程式 A 在資料量比較小的情況下時空消耗都還好,感覺資料量增大了也不多,消耗卻像細胞分裂一樣吃掉了遠遠高於預期的資源,慢慢嘗試後我們會發現,隱隱約約消耗與資料量有著函式關係式的對應,或是線性,或是呈指數。
於是為了拋棄上面那種粗略量化的糟粕,我們有了更精確的定性定量的工具。
離散數學討論了這樣一個問題:y = x
和 y = x ^ 2
,當 x 越來越大時,誰增長的更快呢?
顯然是 x ^ 2,那麼當我們研究一個 y = 2x + 3x ^ 2
,這樣的問題時,是不是可以忽略 2x 這項的消耗呢?
舉個簡單的例子,小胖和小美一起吃飯,當兩人吃的時間足夠長,東西足夠多的時候,我們是不是可以斷言,伙食費裡面的絕大部分都是小胖吃的?
所以一個很聰明的辦法是在更大的損耗面前,忽略那些不這麼重要的消耗。
而演算法導論等著作中,關於時空消耗有著非常清晰且規整的介紹,下篇聊聊!
本作品採用《CC 協議》,轉載必須註明作者和本文連結