書籍資訊

  • 書名:《圖解演算法:使用 C#》
  • 作者:吳燦銘、胡昭民
  • 這篇主題:先建立演算法入門時最核心的思考方式

這篇在講什麼

這一篇比較像整本書的起手式,重點不是馬上丟出某個演算法,而是先把幾個基本觀念釐清:

  • 什麼是運算思維
  • 什麼是演算法
  • 怎麼理解時間複雜度
  • 程式語言和演算法之間的關係

什麼是運算思維

運算思維可以理解成一套拆問題的方法。面對一個看起來很亂的需求時,先不要急著寫程式,而是先把它變成可以處理的結構。

常見的做法大致有幾個方向:

  • 拆解問題:把大問題切成幾個小問題
  • 找出規律:觀察重複出現的模式
  • 抽象化:先忽略暫時不重要的細節
  • 流程化:把解法整理成明確步驟

這件事很重要,因為大多數卡住的時候,問題通常不是語法不會,而是根本還沒把題目想清楚。

什麼是演算法

演算法就是為了解決某個問題而設計的一組步驟。這些步驟必須是清楚、有限,而且真的能執行的。

一個演算法通常至少會有幾個基本特徵:

  • 有輸入
  • 有輸出
  • 每一步都要明確
  • 不會無限做下去
  • 步驟必須能落實成可執行的操作

換句話說,演算法不是模糊的想法,而是能夠被寫成程式、也能被別人重現的解法。

時間複雜度怎麼看

時間複雜度不是在算「這段程式花了幾秒」,而是在比較資料量變大時,演算法成本會怎麼變。

常見順序大致如下:

O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(n^3) < O(2^n)

這種表示法的重點不是背公式,而是建立直覺:

  • 哪些做法資料一大就會開始失控
  • 哪些做法可以比較穩定地擴張
  • 哪些演算法只適合小規模輸入

只要開始比較兩種解法,就一定會碰到複雜度問題。

程式語言和演算法的關係

程式語言本身不是演算法,但它決定了你如何把演算法表達出來。

從流程控制來看,最基本的程式結構通常是:

  • 順序
  • 選擇
  • 重複

而如果再加上物件導向的觀念,還會碰到:

  • 封裝
  • 繼承
  • 多型

這些概念雖然不是演算法本體,但會影響你怎麼組織程式、怎麼把解法寫得可維護。

我自己的整理

這一篇最有價值的地方,是把「寫程式」和「解問題」分開來看。

真正的順序比較像這樣:

  1. 先定義問題
  2. 再拆出步驟
  3. 接著比較成本
  4. 最後才選擇怎麼用程式語言表達

如果順序反過來,很容易變成先寫、再一邊猜自己到底在解什麼。

先記住的重點

  • 運算思維的核心是拆解、找規律、抽象化、流程化
  • 演算法是一組清楚、有限、可執行的解題步驟
  • 時間複雜度看的是成長趨勢,不是單次執行秒數
  • 程式語言是表達工具,但不等於解題思路本身