Skip to main content
類別: 思維
類型: 實踐習慣
來源: 歐幾里得《幾何原本》第七卷命題 2;這個詞來自花拉子米拉丁化的名字;高德納《The Art of Computer Programming》第 1 卷(Addison-Wesley,1968)
別名: 寫下會停止的流程
快速回答 — 演算法思維(Algorithmic Thinking)是一種習慣:把會重複的事寫成有限的流程。每一步都明確,流程會停,另一個人能拿輸出對照你寫下的輸入。歐幾里得《幾何原本》第七卷命題 2 已經是這個形狀。高德納在 1968 年的清單上要求有限、明確、輸入、輸出和可執行。要點是別人也能跑完的流程,不是私下的手感,也不是看不透的模型。

什麼是演算法思維?

演算法思維是一種習慣:把會重複的事,寫成另一個人能夠執行、也能夠核對的有限流程。
給定兩個彼此不互素的數,求它們的最大公度量。
這是希思(Thomas L. Heath)英譯歐幾里得《幾何原本》第七卷命題 2 的任務,這裡譯成中文。原書沒有使用 algorithm 這個詞。「彼此不互素」對應的是後來教科書裡的「不互素」。這條命題仍然點明了輸入、動作的順序,以及停止的地方。 日常的畫面是貼在共用冰箱上的食譜卡。「看到合適了就停」要下一個人去猜。「小火十二分鐘,然後停」不用猜。分析思維 說明問題的各部分怎樣互相依賴。它本身並不把一個會停止的流程交給下一個人。演繹推理 問的是:前提為真時,結論是否必然跟著成立。本站的演繹推理頁用《幾何原本》談的是那種鏈條。流程裡的某一步可以是一次演繹。這裡的習慣是整條流程,包括它在哪裡停。 計算思維 是更大的一套。2011 年,ISTE 與電腦科學教師協會把演算法思維放進那一套裡,稱作「一系列有序步驟」。本頁就是這一系列。滿意化思維 在選項跨過一條標準時停下來。那也是一條停止規則。它並不要求步驟明確到第二個人會走到同一個選項,並且能夠核對。 一個人無法查看其步驟的機器學習模型,是另一件東西。高德納的可執行性檢驗是鉛筆和紙。下一個人做不了這一步,流程就還沒寫完。

演算法思維的三層理解

  • 入門:線索是一件你會重複的事。寫下輸入、按順序排列的步驟,以及停止處。如果第二個人還得問你是什麼意思,這一步就還不明確。
  • 實踐:讓另一個人用一個普通例子和一個棘手的例子各跑一遍。兩遍結果分叉的地方,就重寫那一步。卡片上加一個代號,並不算完成這次核對。
  • 進階:在你要覆蓋的例子上從不改變輸出的那一步,核對之後可以刪掉。一條可能永遠不停的流程,在高德納的意義上不是演算法。某一群人身上很高的敏感度,並不是一張許可證,不能把步驟用到推導時排除在外的人身上。

起源

把會停止的流程寫下來,這個習慣比英文裡的那個詞更早。詞本身、高德納的五項特徵,以及學校裡的名稱,都來得更晚。它們指的範圍並不相同。 《幾何原本》第七卷命題 2,求兩個不互素的數的最大公度量。如果較小數能量盡較大數,它就是最大公度量。如果不能,就把較小數從較大數裡一次次減去,直到剩下一個能量盡前一個數的數。命題 1 是相鄰的情形。如果這個過程剩下一個單位,這兩個數就互素。Britannica 把《幾何原本》定在約西元前 300 年。那是這本書通常的年代,不是一份簽了日期的手稿。命題用的是反覆相減。後來的教學常常把一串減法換成一次除法的餘數。這個捷徑是等價的。它不是第七卷的措辭。高德納把後來的形式叫做歐幾里得演算法。那個名字是他用來舉例的演算法。它不是歐幾里得書裡的詞。 algorithm 這個詞來自一個名字,不是來自歐幾里得。穆罕默德·伊本·穆薩·花拉子米(al-Khwarizmi)九世紀在巴格達工作,在智慧宮,當時的統治者是馬蒙(al-Ma’mun)。Britannica 把兩本書分開。《Al-Kitāb al-mukhtaṣar fī ḥisāb al-jabr waʾl-muqābala》是代數書。algebra 這個詞來自書名。另一本講印度數字計算的算術書,以拉丁文本留下來,題為 Algoritmi de numero Indorum(「花拉子米論印度演算法」)。algorithm 來自這個標題裡的拉丁化名字 Algoritmi。這本算術的阿拉伯文原本沒有留存。MacTutor 數學史指出,已知拉丁文本改動很大,阿拉伯文原題也不為人知。本頁不把他寫成流程的發明者。第七卷更早。他是這個詞的名字來源,也是系統計算的作者。 高德納(Donald Knuth)在《The Art of Computer Programming》第 1 卷《Fundamental Algorithms》(Addison-Wesley,1968)第 1.1 節寫下五項特徵。有限:流程在有限步之後停止。明確:每一步把動作規定到每一種情形都沒有歧義。輸入:零個或多個量,取自寫明的集合。輸出:一個或多個量,與輸入有寫明的關係。可執行:每個操作都基本到一個人用鉛筆和紙,可以在有限時間裡精確做完。在那一節裡,一條可能永遠不停的流程是 computational method,不是演算法。他是在命名特徵。他不是在報告這個習慣的一次試驗。 Gerald Futschek 2006 年在維也納工業大學寫了學校裡的這個名稱。章節收在《Lecture Notes in Computer Science》第 4226 卷,第 159–168 頁。他說這個詞當時已經常被用來指資訊學教育裡的一種能力。他沒有把自己寫成造詞的人。他描述的是一組能力:分析問題並把它寫精確;找到合適的基本動作,並用這些動作造出正確的演算法;把特殊情形和通常情形都想過,然後再提高效率。他認為這些能力可以在不學寫程式的情況下培養。那門大學預科課裡的圖,是為了讓正確性、終止、效率、確定性與並行變得看得見。那是一門課的教學目標。它們不是一項測到的增益。 2011 年,國際教育技術協會(ISTE)與電腦科學教師協會發表了一份面向 K–12 的計算思維操作定義。他們報告說,近 700 名電腦科學教師、研究者和實踐者接受了調查,並且壓倒性地支持這份文本。清單上的一行是:「透過演算法思維把解法自動化(一系列有序步驟)。」定義說,計算思維包括這份清單,並且不限於它。在本站,計算思維是更大的一套。演算法思維是那套有序的流程。

核心要點

當一個當時不在場的人可能得把這件事再做一遍時,演算法思維用得上。某一步仍然要靠你私下的判斷,或者流程沒有停止處,它就會停住。
1

先寫下輸入和輸出,再寫步驟

寫明流程接受什麼,以及必須交回什麼。歐幾里得的命題接受兩個不互素的數,交回它們的最大公度量。下面案例裡的渥太華踝關節規則,接受名單之內的、踝關節急性受傷的成年人,交回一個決定:拍片,或不拍片。「把腳踝處理好」還不是輸出。
2

讓每一步都明確

第二個人不必猜測動作,這一步才算明確。「看看他們能不能走」並不明確。踝關節規則數的是四步:每條腿各轉移兩次體重,允許跛行。1993 年的論文說,先判斷骨壓痛,不要把人推進去走。1995 年的試驗裡,一種常見的漏法是腓骨後緣的觸診沒有做滿遠端 6 cm。少摸的那一截,不是這條規則。
3

寫下停止處

說清什麼時候流程結束,以及到那時人該做什麼。在第七卷裡,停止處是一個能量盡前一個數的數。在高德納的清單裡,一條可能沒有盡頭的流程是 computational method,不是演算法。在踝關節規則裡,停止處是拍片與否的決定。1995 年的作者加了一句收尾:如果疼痛或負重能力在五到七天內沒有好轉,告訴對方再來。一張只寫著「先看著」的卡片,沒有寫出停止處。
4

先跑棘手的例子,再縮短卡片

Futschek 的清單包括特殊情形,不只是通常情形。用一個靠近邊界的例子,再用一個規則排除在外的例子,把流程跑一遍。如果某一步在你要覆蓋的例子上從不改變輸出,你可以刪掉它,並且應當寫明你核對過。1993 年的精煉版因此刪掉了一條年齡標準和一條骰骨壓痛標準,而且只在那次精煉之內。一張從未核對過的更短的卡片,是另一件東西。

應用場景

當別人可能重複這件事,而你需要一個能夠核對的結果時,使用演算法思維。寫下輸入、明確的步驟和停止處。然後讓第二個人試那個棘手的例子。

把做過的順序交給同學

在一種還會再遇到的題目之前,寫下輸入、步驟和停止處。把卡片交給當時不在場的同學。他們卡住的地方,或者結果分叉的地方,就重寫那一步。交不出去的私人捷徑,仍然只是手感。

改掉兩個人做法不同的交接

對一件反覆出現的工作交接,寫明輸入、誰來做、做什麼,以及什麼條件讓工作停下並向上送。讓兩個人跑同一個例子。如果他們停在不同的地方,這一步就還不明確。一個共享資料夾補不上那個缺失的停止處。

留下可計數的核對,而不是感覺

對另一位成年人會做的家務,把「確認做完了」換成一次可計數的核對和一個停止處。模式是一個數字、一個順序,以及一句不要臨場改測試的話。只有你能讀懂的條子,蓋不住第二天早晨。

寫明規則不適用於誰

志工或公共櫃台重複做同一個決定時,寫下檢查的順序,以及規則排除的人。1993 年的踝關節規則排除了 18 歲以下、懷孕、受傷超過十天,以及覆診,此外還有別的條目。把步驟抄到這些界線之外,就是另一套流程。把排除對象寫在卡片上。

經典案例

渥太華踝關節規則(Ottawa ankle rules)是為一個急診決定寫下的流程。這個成年人、這次踝關節急性受傷,需不需要拍片?Ian Stiell 與渥太華的同事寫出規則,然後試驗其他醫師被要求使用它們時發生了什麼。這些試驗測量的是急診部門裡的這次引入。它們不測量廚房、教室,或一個下午對著空白卡片養成的習慣。 Stiell 與同事在 1993 年 3 月 3 日的《JAMA》(第 269 卷,第 1127–1132 頁)報告了精煉後的規則。只有踝區有疼痛,並且下列三項裡至少有一項,才做踝部 X 光系列。一項是腓骨後緣遠端 6 cm 或外踝尖的骨壓痛。另一項是脛骨上同樣的壓痛,沿後緣或在內踝尖。第三項是受傷當時和在急診部門都不能負重走四步。足部系列改用中足區。第五蹠骨基底骨壓痛、舟骨骨壓痛,或同樣的四步失敗,才做足部系列。四步是指每條腿各轉移兩次體重。跛行也算。論文說,先判斷骨壓痛,再讓人走,並且絕不強迫。 那次精煉排除了好幾組人。它排除 18 歲以下、懷孕,以及單純的皮膚損傷。它也排除已經帶著片子轉來的人、受傷超過 10 天,以及同一次受傷的覆診。論文說,更早的一條年齡標準,以及一條骰骨壓痛標準,是多餘的。那次精煉裡有臨床意義的骨折,沒有它們也能識別出來。 同一篇論文有兩個階段,結果不是同一個。第一階段,原始規則對 121 例踝區骨折的敏感度是 1.0,95% 信賴區間從 0.97 到 1.0。對 49 例中足區骨折,敏感度是 0.98,區間從 0.88 到 1.0。116 名病人上對規則的解讀仍在第一階段,踝部系列的 kappa 是 0.56,足部系列是 0.69。兩位讀者並不總是標出同一個結果。這不是後來醫院裡精煉規則的一致程度。第二階段,精煉後的規則對 50 例踝區骨折的敏感度是 1.0,區間從 0.93 到 1.0。對 19 例中足區骨折,敏感度也是 1.0,區間從 0.83 到 1.0。論文的結論把精煉後的規則稱為 100% 敏感。這個說法跟著的是 1.0 的點估計。區間比一個單點更寬。論文還估計,踝部系列的拍片有可能減少 34%,足部系列有可能減少 30%。如果規則為陰性,它把骨折機率估計為 0%。踝部系列的區間從 0% 到 0.8%,足部系列從 0% 到 0.4%。這 34% 和 30% 是驗證樣本裡的潛在降幅。它們不是後來試驗的結果。 1994 年 3 月 16 日的《JAMA》(第 271 卷,第 827–832 頁)把規則帶進兩家醫院。設計不是隨機的。它使用前後兩個時期,以及一家同期的對照醫院。前後各五個月裡,共有 2,342 名踝關節急性受傷的成年人。實施醫院的踝部拍片相對減少 28%,對照醫院增加 2%。實施醫院的足部拍片相對減少 14%,對照醫院增加 13%。在實施醫院的後一時期,沒有骨折的病人裡,未拍片就離開的人在部門待了 80 分鐘,拍了片的人待了 116 分鐘。論文估計的醫療總費用,含醫師看診和拍片,是 62對62 對 173。對急診醫師照護的滿意度是 95% 對 96%。這兩組後來再拍片的比例都是 5%。74 例踝部骨折的敏感度是 1.0(區間 0.95 到 1.0),19 例中足骨折也是 1.0(區間 0.82 到 1.0)。隨後 12 個月,實施醫院的拍片用量沒有回升。分鐘之差和金額之差比較的是後一時期裡的兩組人。它們不是整個部門的前後對比。論文沒有寫明這些金額用的是哪一種貨幣。 範圍更大的試驗是 Stiell、George Wells、Andreas Laupacis 與同事,發表於 1995 年 9 月 2 日的《BMJ》(第 311 卷,第 594 頁)。這是一項多中心的前後比較試驗,在加拿大八家教學醫院和社區醫院的急診部門進行。這些社區的人口從 1 萬到 300 萬。全部 12,777 名踝關節急性受傷的成年人都包括在內:對照期 6,288 人,實施期 6,489 人。對照期是 1991 年 5 月 1 日到 1992 年 4 月 30 日。實施期是 1993 年 1 月 1 日到 12 月 31 日。兩個時期不是連在一起的連續兩年。200 多名醫師透過一小時講課學習規則,另有講義、口袋卡片,以及每個部門兩張海報。某一個病人拍不拍片,仍由接診醫師決定。分析保留每一名合格病人,不論那位醫師有沒有填表,也不論有沒有遵守規則。論文把有臨床重要性的骨折定義為寬度大於 3 mm。 對照期有 82.8% 的病人接受踝部拍片(6,288 人中的 5,207 人),實施期是 60.9%(6,489 人中的 3,955 人)。論文把這個變化稱為相對減少 26.4%,P 小於 0.001。這一比例在全部八家醫院都下降,也在預先劃定的亞組裡下降:社區醫院、教學醫院、急診醫師、家庭醫師和住院醫師。足部拍片並沒有一起動。三家醫院有顯著減少。五家沒有顯著變化。實施期裡,完全沒有拍片的病人更多(21.7% 對 8.4%),踝部與足部兩個系列都拍的更少(9.2% 對 21.8%)。 時間和帳單是實施期內部的比較。它們不是部門的前後對比。沒有骨折、也沒有拍片的病人,在部門的平均時間是 54.0 分鐘,標準差 42.0。拍了片的人是 86.9 分鐘,標準差 46.9。電話追蹤到的病人,平均總費用是 70.20 美元(標準差 52.1)對 161.60 美元(標準差 71.2),按 1993 年美元計算。這些費用涵蓋的是這一追蹤子集的急診與後續就診,以及 X 光系列。它們不是一個衛生體系被測到的節省。作者的結論說,這次引入帶來了更短的等待和更低的費用。印出來的比較並沒有給出部門平均等待時間或預算在前後的數字。 漏診骨折也要用同樣的方式看待分母。論文說,對照期沒有漏診骨折的資料。實施期的追蹤裡,2,033 人中有 10 人出院後被診斷出骨折,且沒有新的受傷。拍過片的 732 人裡有 3 人在這 10 人之中(0.4%)。沒有拍片的 1,301 人裡有 7 人在這 10 人之中(0.5%)。摘要裡的「0.5 對 0.4」就是這個比較。它不是對照期比率對實施期比率。結果部分說,這 7 人裡只有 1 人是正確應用了規則。討論部分指向同一張表,說未拍片這一組的漏診來自沒有使用規則或讀錯了規則,另有 1 例來自明顯腫脹。全部 10 人在六個月時都已癒合,沒有延遲,也沒有長期影響。沒有人提起訴訟。另一個計數發生在出院之前:1,090 例重要骨折裡有 6 例,規則被讀成陰性。這 6 例裡,醫師出於別的理由開了片子,主要是明顯腫脹。陰性解讀在這 6 例裡不是最後一句。 論文還印了兩個相鄰的人數,本頁不把它們合成一個。它說電話樣本 2,171 人中聯繫上了 2,032 人(93.6%)。骨折那一句用的分母是 2,033。兩個數字都是論文裡的。它們不是一個四捨五入後的計數。 表格方面,醫師為 6,489 名實施期病人中的 77.1% 填了研究表(5,003 人)。論文接著報告,踝部病例的準確解讀是 97.1%,足部是 97.6%;踝部的滿意遵從是 95.3%,足部是 95.0%。那一句沒有再次寫明分母。規則判定為不必要的拍片仍然發生在 4.9% 的病例裡,其中 0.5% 是因為病人堅持。醫師說自己在 3.8% 的病例裡對使用規則感到不安。討論點名了常見的讀法錯誤:忽略內踝壓痛,或者沒有把腓骨後緣遠端 6 cm 全部觸診到。有些骨折在尖端上方 5 或 6 cm 處穿出骨質。 Bachmann 與同事在 2003 年 2 月 22 日的《BMJ》(第 326 卷,第 417 頁)綜述了同一套規則。他們納入 32 項研究,統合分析使用其中報告了 15,581 名病人的 27 項。合併後的陰性概似比,踝部是 0.08(區間 0.03 到 0.18),中足是 0.08(0.03 到 0.20)。兒童的兩個部位合併後是 0.07(0.03 到 0.18)。綜述說敏感度幾乎是 100%,特異度不高,使用後應當把不必要的拍片減少 30% 到 40%。綜述內部,報告的敏感度從傷後 48 小時內應用規則的研究中的 99.6%,到合併評估研究中的 96.4%。「應當減少」是綜述對使用效果的結論。它不是 1995 年試驗裡 26.4% 的相對減少,也不是 1994 年那家醫院 28% 的相對減少。統計思維 要讓點估計、區間、相對減少和概似比不要收成一個數字。 教訓很窄。一套寫下了部位、數得清的行走和停止處的流程,可以教給沒有參與撰寫的醫師。在這些試驗裡,踝部拍片下降了。1995 年的論文並沒有顯示,未拍片回家的人後來骨折的比率高於拍了片的人。同一份記錄也顯示流程的限度。1993 年讀者並不總是一致。1995 年八家醫院裡有五家的足部片子沒有下降。6 例重要骨折出現在卡片被讀成陰性的時候。1 例後來的骨折跟在一次正確的「不拍片」之後。系統思維 還會把卡片外面的東西算進去:那一小時的教學、海報,以及醫師仍然可以下令拍片。這些試驗沒有給出這個習慣在一般情況下的效應。

邊界與失效場景

演算法思維在三處失效。任務可能沒有能夠核對的輸出。步驟可能被用到它們所寫明的輸入之外。或者某項研究的百分比被當成了這個習慣本身的屬性。 第一條邊界是穩不住的任務。第七卷假定兩個數和一種量盡。踝關節規則假定一次在名單之內的急性受傷。第一次談話、一場道德衝突,或者一個對不上輸入的案例,都還沒有流程。為了讓卡片存在而寫下步驟,並不會造出一個能夠核對的輸出。計算思維仍可以幫助你把一團亂分開。這個習慣從你能夠寫下輸入和停止處的時候開始。 第二條邊界是規則留在外面的人。1993 年的精煉排除了兒童、懷孕、單純皮膚損傷、別處已經拍過的片子、超過十天的受傷,以及覆診。1995 年的試驗納入的是成年人。它的討論另列了一張單子,作者說這些情況下評估可能不可靠:意識改變、醉酒、另有疼痛的損傷、腿部感覺減退,或語言障礙。它也提到明顯腫脹會讓後緣無法觸診。Bachmann 的綜述把一個兒童亞組合在一起,陰性概似比是 0.07。那一行說的是進入彙總的那些研究裡的規則。它不是一項發現,說成人卡片可以不經另一次核對就抄到每一個孩子身上。流程只在它寫明的輸入之內才是明確的。 常見的誤用,是把百分比當成這個習慣的證明。不要把 26.4%、28%、34% 或 30% 引成演算法思維、一次工作坊或一張家庭卡片的效應。1993 年的數字是驗證樣本裡的潛在降幅。1994 年的數字是相對一家同期醫院的相對變化,設計並非隨機。1995 年的數字是兩個隔開的年份之間的相對變化,發生在講課和海報之後,醫師仍然可以自由下令拍片。不要把 54 分鐘對 87 分鐘,或 70.20 美元對 161.60 美元,引成一個部門的前後對比。那些差距在實施期內部,比較的是沒有骨折的病人裡拍了片和沒拍片的人。不要把討論裡約成「大約 90 美元」的差距,或它說這八家醫院若減少 25% 就會節省可觀費用的那句話,當成另一次測量。不要把 1.0 的敏感度引成保證。1993 年第一階段對 49 例中足骨折是 0.98。1994 年中足的區間在 19 例骨折上從 0.82 到 1.0。Bachmann 的合併評估數字是 96.4%。不要把綜述的 30% 到 40% 引成那些試驗測到的降幅。

常見誤區

有三種混淆會跟著這個名字走。這個習慣會被誤認為寫程式,被誤認為那套更寬的計算思維,也被誤認為一條敏感的規則走到哪裡都成立。
Futschek 2006 年的章節認為,這些能力可以在不學寫程式的情況下培養。高德納的可執行性檢驗是一個人、一支鉛筆和一張紙。程式碼是攜帶一套已經明確的流程的一種方式。一段你無法向第二個人講清的程式,還沒有完成這個習慣。「像電腦一樣思考」不是要求。電腦可以跑一個不停的迴圈。這個習慣必須停。
2011 年 ISTE 與 CSTA 的定義把演算法思維列為計算思維的一部分:一系列有序步驟。同一份定義還包括表述問題、組織資料、抽象和遷移,並且說清單並非窮盡。你可以寫下有序流程,同時跳過其餘部分。你也可以做完其餘部分,仍把步驟留得第二個人無法執行。在本站,兩頁是嵌套的。它們不是同一個習慣的兩個名字。
1993 年第二階段和 1994 年計數裡的敏感度 1.0,是那些階段所見到的骨折上的點估計。計數小時,區間會變寬。1993 年結論裡的「100% 敏感」跟著的是這些點估計。Bachmann 的綜述說「幾乎 100%」,同時也報告合併評估為 96.4%。1995 年的試驗裡,6 例重要骨折出現在規則被讀成陰性的時候,另有 1 例後來的骨折跟在一次正確的陰性解讀之後。高敏感度屬於一條在寫明的人群上檢驗過的規則。它不屬於「把流程寫下來」這個習慣本身。

相關概念

演算法思維旁邊,是把事物拆開、推出必然結論,或因別的理由停下來的習慣。下面的連結是鄰居。它們不是這套流程的別名。

計算思維

本站上更大的一套:分解、模式、抽象和演算法。這個習慣是那一套裡面的有序流程。

分析思維

說明各部分怎樣互相依賴。一份部件清單本身,不會給下一個人順序和停止處。

演繹推理

推出前提為真時必然成立的結論。某一步裡可以有演繹。這個習慣是整條流程。

滿意化思維

在選項跨過標準時停下來。這個停止可以是明智的。它仍可能不是第二個人能夠核對的流程。

系統思維

問卡片外面還有什麼。在踝關節試驗裡,那包括講課、海報,以及仍然可以下令拍片的自由。

統計思維

讓點估計、區間、相對減少和概似比不要被當成同一個數字。

一句話總結

寫下輸入、明確的步驟和停止處,先讓當時不在場的人跑一遍棘手的例子,再信任那張縮短後的卡片。