1.3 小結¶
1. 重點回顧¶
- 演算法在日常生活中無處不在,並不是遙不可及的高深知識。實際上,我們已經在不知不覺中學會了許多演算法,用以解決生活中的大小問題。
- 查字典的原理與二分搜尋演算法相一致。二分搜尋演算法體現了分而治之的重要演算法思想。
- 整理撲克的過程與插入排序演算法非常類似。插入排序演算法適合排序小型資料集。
- 貨幣找零的步驟本質上是貪婪演算法,每一步都採取當前看來最好的選擇。
- 演算法是在有限時間內解決特定問題的一組指令或操作步驟,而資料結構是計算機中組織和儲存資料的方式。
- 資料結構與演算法緊密相連。資料結構是演算法的基石,而演算法為資料結構注入生命力。
- 我們可以將資料結構與演算法類比為拼裝積木,積木代表資料,積木的形狀和連線方式等代表資料結構,拼裝積木的步驟則對應演算法。
2. Q & A¶
Q:作為一名程式設計師,我在日常工作中從未用演算法解決過問題,常用演算法都被程式語言封裝好了,直接用就可以了;這是否意味著我們工作中的問題還沒有到達需要演算法的程度?
如果把具體的工作技能比作是武功的“招式”的話,那麼基礎科目應該更像是“內功”。
我認為學演算法(以及其他基礎科目)的意義不是在於在工作中從零實現它,而是基於學到的知識,在解決問題時能夠作出專業的反應和判斷,從而提升工作的整體質量。舉一個簡單例子,每種程式語言都內建了排序函式:
- 如果我們沒有學過資料結構與演算法,那麼給定任何資料,我們可能都塞給這個排序函式去做了。執行順暢、效能不錯,看上去並沒有什麼問題。
- 但如果學過演算法,我們就會知道內建排序函式的時間複雜度是 \(O(n \log n)\) ;而如果給定的資料是固定位數的整數(例如學號),那麼我們就可以用效率更高的“基數排序”來做,將時間複雜度降為 \(O(nk)\) ,其中 \(k\) 為位數。當資料體量很大時,節省出來的執行時間就能創造較大價值(成本降低、體驗變好等)。
在工程領域中,大量問題是難以達到最優解的,許多問題只是被“差不多”地解決了。問題的難易程度一方面取決於問題本身的性質,另一方面也取決於觀測問題的人的知識儲備。人的知識越完備、經驗越多,分析問題就會越深入,問題就能被解決得更優雅。
Q:現在幾乎所有程式碼都讓 AI Agent 寫了,我們還有必要學習演算法嗎?
引用一下李沐老師的話:“agent 是能力放大器,就是能力 x10,而不是加法器,不是能力 +10。”
既然 AI 是能力放大器,那麼作為基數的“能力”也很重要。我覺得兩方面能力尤其值得積累:一是表達能力,尤其是和 AI 協作的能力。講清目標、補足背景、及時糾偏。向 AI 解釋問題,也是在幫自己想清楚問題。二是基礎知識。細節可以讓 AI 補,但基本概念得自己懂,才能問到點上、判斷對錯,把它的輸出變成有用的成果。
AI 很特別的一點是,它不像過去的工具那樣有清晰的功能邊界。它有點像水,到了不同的人手裡,會呈現出不同的形狀。人的能力越強、taste 越好,AI 的放大效應就越明顯。