歡迎來到計算方法(Computational Methods)的世界!

你好!你有沒有想過,軟體工程師是如何解決那些龐大且複雜的問題?例如繪製全球地圖以供 GPS 使用,或是創造一台能擊敗國際象棋冠軍的電腦?他們並不會一坐下來就開始寫程式,而是會先運用一套被稱為計算方法(Computational Methods)的思維工具。

在本章中,你將學習如何以電腦科學家的角度去審視問題。我們將探索如何拆解大型任務、尋找能得出「足夠好」答案的捷徑,並在系統尚未構建前先建立模型。如果初次接觸這些術語覺得有點深奧,請不用擔心——我們將透過許多生活化的例子,一步一步為你拆解!

1. 什麼問題是可計算的?

在我們使用電腦解決問題之前,必須先判斷該問題是否適合透過計算方法處理(amenable to a computational approach)。簡單來說,就是:電腦真的能處理這個問題嗎?

適合由電腦解決的問題通常具備以下特徵:

  • 明確的輸入與輸出(Clear Inputs and Outputs):我們能明確定義輸入什麼數據,以及預期得到什麼樣的輸出。
  • 定義明確的規則(Defined Rules):問題遵循一套邏輯步驟(即演算法)。
  • 有限的時間(Finite Time):電腦必須能在合理的時間內得出答案。

例子:計算兩座城市之間的最短路徑是可計算的問題;但要預測你十年後的晚餐想吃什麼?這就太難了——因為存在太多不可預測的變數!

2. 核心「思維」方法

以下這三種技巧是解決問題的基石。你可能在「計算思維」章節中見過它們,但這裡我們將從軟體開發的實務層面來重新認識。

問題識別(Problem Recognition)

這指的是面對新問題時,問自己:「慢著,我以前見過類似的情況嗎?」電腦非常擅長處理模式(patterns)。如果你能辨識出新問題不過是舊問題的變體,你就可以直接套用現有的演算法。

問題分解(Problem Decomposition)

這是一個將複雜問題拆解成較小、較易於處理的部分,即子問題(sub-problems)的過程。
比喻:如果你接到「舉辦音樂節」的任務,一定會感到手足無措。但如果你把它分解為「預訂樂隊」、「僱用保安」和「售票」,任務就變得容易管理多了。

抽象化(Use of Abstraction)

抽象化是指去除不必要的細節,以便專注於重要部分的過程。
比喻:倫敦地鐵圖就是一個完美的抽象化例子。它沒有顯示軌道的真實彎曲度或隧道的深度,只顯示了車站和路線連結,因為這才是乘客真正需要知道的資訊。

快速回顧:三大思維

識別:尋找規律。
分解:拆解問題。
抽象化:隱藏「多餘」的細節。

3. 分治法(Divide and Conquer)

這是一種具體且強大的解題方法。其運作方式如下:
1. 分(Dividing):將問題拆解為該問題的較小版本。
2. 解(Solving):解決最小的版本(即「基本案例」或 base case)。
3. 合(Conquering):將解決方案重新組合起來。

許多著名的演算法,如合併排序(Merge Sort)二分搜尋(Binary Search),都使用了這種方法。比起試圖一次性解決巨大的問題,這種方法通常要快得多。

4. 工程師的工具箱

有時,基本的邏輯還不夠用。以下是你在 OCR 課程大綱中需要掌握的專業方法:

回溯法(Backtracking)

這是一種「試誤」方法。你沿著一條路徑嘗試尋找答案;如果遇到死胡同,就回溯(backtrack)到上一個正確的節點,然後嘗試另一條路徑。

比喻:走出迷宮。如果你撞到牆,你不會在那裡停滯不前,而是會回到上一個分岔路口,改走另一條路。

數據挖掘(Data Mining)

這涉及搜尋海量數據(大數據)以找出人類難以察覺的隱藏模式(hidden patterns)或關聯性。
你知道嗎?超市透過挖掘會員卡數據發現,購買嬰兒紙尿片的人經常同時購買啤酒,因此他們會將這兩類商品放在貨架的鄰近位置!

啟發式方法(Heuristics)

有時,尋找「完美」的答案需要太長時間。啟發式方法是一種「經驗法則」或「最佳猜測」,能快速找到一個足夠好的解決方案。
例子:「A* 演算法」使用啟發式方法來規劃電子遊戲中的路徑。它不會檢查地圖上的每一個原子,而是朝著目標的大致方向移動。

效能建模(Performance Modelling)

在構建大型系統(如全新的銀行網絡)之前,我們會建立數學模型來觀察它在壓力下的表現。這有助於在「正式版」建成之前就避免系統崩潰。

流水線技術(Pipelining)

這是一種透過在當前任務完成之前就啟動下一個任務來提升效率的方法。
比喻:在汽車工廠裡,工人不會等一輛車完全裝配好才開始製作下一輛。當一輛車正在裝車門時,下一輛車已經在安裝引擎了。
關鍵重點:流水線是關於重疊(overlapping)任務以節省時間。

視覺化(Visualisation)

這是將複雜數據轉化為視覺格式(如圖表或 3D 模型)的過程。這能讓人類更容易發現趨勢、異常值或錯誤,而這些在巨大的數值列表中是難以發現的。

5. 總結檢查清單

在繼續前進之前,請確保你能向朋友解釋以下內容:

  • 我能解釋為什麼問題可能(或不可能)被計算解決嗎?(規則、輸入、輸出)。
  • 我了解分解與抽象化的區別嗎?(拆解 vs. 隱藏細節)。
  • 我能解釋「分治法」嗎?(將任務切分為更小的相同子任務)。
  • 我熟悉我的工具箱嗎?(回溯法、數據挖掘、啟發式方法、效能建模、流水線、視覺化)。

常見錯誤提醒:不要將流水線(Pipelining)並行處理(Concurrent Processing)混淆。流水線是指在序列中將「不同任務」的階段重疊;而並行處理則是指在同一時間執行多個任務。

如果覺得定義太多,請別擔心!只要記住這些方法其實只是為了以更聰明的方式「偷懶」——也就是找到通往答案的最有效路徑!