書籍資訊
- 書名:《圖解演算法:使用 C#》
- 作者:吳燦銘、胡昭民
- 這篇主題:先建立演算法入門時最核心的思考方式
這篇在講什麼
這一篇比較像整本書的起手式,重點不是馬上丟出某個演算法,而是先把幾個基本觀念釐清:
- 什麼是運算思維
- 什麼是演算法
- 怎麼理解時間複雜度
- 程式語言和演算法之間的關係
什麼是運算思維
運算思維可以理解成一套拆問題的方法。面對一個看起來很亂的需求時,先不要急著寫程式,而是先把它變成可以處理的結構。
常見的做法大致有幾個方向:
- 拆解問題:把大問題切成幾個小問題
- 找出規律:觀察重複出現的模式
- 抽象化:先忽略暫時不重要的細節
- 流程化:把解法整理成明確步驟
這件事很重要,因為大多數卡住的時候,問題通常不是語法不會,而是根本還沒把題目想清楚。
什麼是演算法
演算法就是為了解決某個問題而設計的一組步驟。這些步驟必須是清楚、有限,而且真的能執行的。
一個演算法通常至少會有幾個基本特徵:
- 有輸入
- 有輸出
- 每一步都要明確
- 不會無限做下去
- 步驟必須能落實成可執行的操作
換句話說,演算法不是模糊的想法,而是能夠被寫成程式、也能被別人重現的解法。
時間複雜度怎麼看
時間複雜度不是在算「這段程式花了幾秒」,而是在比較資料量變大時,演算法成本會怎麼變。
常見順序大致如下:
O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(n^3) < O(2^n)
這種表示法的重點不是背公式,而是建立直覺:
- 哪些做法資料一大就會開始失控
- 哪些做法可以比較穩定地擴張
- 哪些演算法只適合小規模輸入
只要開始比較兩種解法,就一定會碰到複雜度問題。
程式語言和演算法的關係
程式語言本身不是演算法,但它決定了你如何把演算法表達出來。
從流程控制來看,最基本的程式結構通常是:
- 順序
- 選擇
- 重複
而如果再加上物件導向的觀念,還會碰到:
- 封裝
- 繼承
- 多型
這些概念雖然不是演算法本體,但會影響你怎麼組織程式、怎麼把解法寫得可維護。
我自己的整理
這一篇最有價值的地方,是把「寫程式」和「解問題」分開來看。
真正的順序比較像這樣:
- 先定義問題
- 再拆出步驟
- 接著比較成本
- 最後才選擇怎麼用程式語言表達
如果順序反過來,很容易變成先寫、再一邊猜自己到底在解什麼。
先記住的重點
- 運算思維的核心是拆解、找規律、抽象化、流程化
- 演算法是一組清楚、有限、可執行的解題步驟
- 時間複雜度看的是成長趨勢,不是單次執行秒數
- 程式語言是表達工具,但不等於解題思路本身