我們為什麼要學習資料結構和演算法?(一)

Squ1rrel發表於2019-12-30

我們假設有一臺執行速度足夠快,記憶體足夠大的電腦(突破普朗克常量物理極限,達到數學層面的無限),快到可以瞬間做完任何任務,大到可以塞下任何程式棧,那麼我們從此似乎不再需要繼續鑽研資料結構和演算法了,暴力求解,暴力遞迴就是一切,顯然,這樣的電腦是不存在的。

舉這個例子就是想說明:資料結構和演算法問題必須放在具體時空條件下,具體情況具體分析,所以我們愛用最佳化這個詞,我們傾向於用更少的空間,更少的時間,做更多的計算,理論上軟體最佳化是有極限的,因為總要給磁碟,記憶體,cpu 物理工作的時間。

我們碰到的問題無非是在受限的時空條件下,完成目標的計算任務,或是基於源程式做定向最佳化。

定標準看起來是一件比較容易的事:

時間嘛,看程式執行多少毫秒就完事了,快就是好。

空間嘛,看佔了多少 bit,少就是好。

似乎很有道理,仔細琢磨一下有這樣一個問題:

程式 A 在資料量比較小的情況下時空消耗都還好,感覺資料量增大了也不多,消耗卻像細胞分裂一樣吃掉了遠遠高於預期的資源,慢慢嘗試後我們會發現,隱隱約約消耗與資料量有著函式關係式的對應,或是線性,或是呈指數。

於是為了拋棄上面那種粗略量化的糟粕,我們有了更精確的定性定量的工具。

離散數學討論了這樣一個問題:y = xy = x ^ 2,當 x 越來越大時,誰增長的更快呢?

顯然是 x ^ 2,那麼當我們研究一個 y = 2x + 3x ^ 2,這樣的問題時,是不是可以忽略 2x 這項的消耗呢?

舉個簡單的例子,小胖和小美一起吃飯,當兩人吃的時間足夠長,東西足夠多的時候,我們是不是可以斷言,伙食費裡面的絕大部分都是小胖吃的?

所以一個很聰明的辦法是在更大的損耗面前,忽略那些不這麼重要的消耗。

而演算法導論等著作中,關於時空消耗有著非常清晰且規整的介紹,下篇聊聊!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
辛勞 篤定 輕苦 微甜 ----汪曾祺

相關文章