天天看點

零代碼的科普算法書《未來算法》讀後

高中階段,我的實體一直很差,好在其他科目還算可以,才能保證總成績不至于太差。究其原因,我現在回頭看,當時真心不明白和糾結于問題大抵如下:

  • 小球為什麼要往下滑?
  • 為什麼是小球,而不是汽車?
  • 小球為什麼不跳起來?
  • 現實中我怎麼從來沒見過絕對光滑的地面?
  • 學小球滑與不滑,這玩意到底有什麼用?

......在我對這些看似課程不相關問題模棱兩可、抓耳撓腮的時候,老師早就講到了别的知識點。這也導緻我一步跟不上,步步跟不上。這還沒完,在聯考結束 16 年後的今天,我還偶爾被夢中:“小球滑動、絕對光滑、實體考試不及格被老師談話” 的場景驚醒吓出一身冷汗。我對于高中實體老師的印象大緻就是:“腦門發亮,每次上課都帶一瓶飲料,講的很好,但是我着實聽不懂,我也不記得老師的名字了,姓也忘記了”。高中實體之于我,是噩夢般的存在。如果再深入分析,其實絕大多數都是我自己的原因。為什麼别的同學不糾結這些問題?為什麼很多同學都能考到接近滿分?在鄉鎮中學應試教育的歲月,老師和同學們關注都是:會做題、拿高分。自己的刨根問底和苛求老師的通俗易懂的講解顯得是那麼的“另類”和“多餘”。這個問題到了大學和研究所學生階段也沒有改觀,當然不再是實體(很慶幸我們計算機專業大學不用學實體)。大學裡學習核心專業課《資料結構》、研究所學生核心專業課《算法設計與分析》等課程,感覺老師基本都是照本宣科,能把書上的概念講清楚,但是沒有講清楚算法背景、起源、應用場景等,更鮮有老師結合現實世界例子講解的通俗易懂。還好後來的我不再有高中的“執念”、“偏執”,采取了下面的幾招,才算搞定個七七八八,至少找工作筆試面試都還不錯。

  • 去找其他的書參考,比如:《大話資料結構》、《圖解算法》系列書學習,這些書能把複雜問題講的淺顯易懂,且讀了也不犯困。
  • 去找國内外頂級的公開課學習,比如:我學習北大張銘老師的《資料結構與算法》,學習了哈佛大學《CS50 計算機科學導論》公開課、MIT《算法導論》公開課。
  • 去自己敲代碼實踐,比如:為了備戰筆試、面試,我将自己實踐梳理的代碼整理為部落格《資料結構之步步為赢》專輯系列。

我印象最深的是 CS50 課的教授為了講解二分查找的“撕書”視訊,讓我身臨其境感到震撼,這或許是“通俗易懂”的最高境界,看了一遍一輩子忘不了的“肌肉記憶”效果,太形象、太生動了。我特意從移動硬碟找到了當時聽課的視訊,現在看依然回味無窮,撕書現場截圖如下:

零代碼的科普算法書《未來算法》讀後

說了那麼多,感觸最深的是:能把基礎原理講的通俗易懂絕非易事,需要非常深入的思考、提煉、練習和總結。由于資料結構和算法的重要性,工作之後我也持續關注相關的動态,尤其關注有什麼新書、教程能把這種基礎理論講的通俗易懂,我認為《漫畫算法》、極客時間的《資料結構與算法》課系列算是近幾年做的比較好的。前兩天刷公衆号消息,偶然間看到諸葛越老師的新書《未來算法》的釋出,IT圈子的大V吳軍、沈向洋、王小川寫的推薦語,令我眼前一亮,當即下單買入。現在已全部讀完,的确不負所望,是一本可讀性非常強的科普書。

零代碼的科普算法書《未來算法》讀後

作者牛是書好的前提,作者諸葛越老師大學:清華、碩博:斯坦福,博士導師剛獲得2021年圖領獎、諸葛越是 Google 創始人之一謝爾蓋·布林的同學、前Hulu全球副總裁、兩個孩子一個讀劍橋大學、一個讀芝加哥大學、《魔鬼老大、天使老二》暢銷書作者,應該是國内外不多見的計算機專家 + 育兒專家的綜合體。可能國内能與之比肩的就是《數學之美》、《浪潮之巅》的作者吳軍博士.....《未來算法》脈絡非常清晰,如下的圖示貫穿全書全部章節,自頂向下的逐個展開講解。

零代碼的科普算法書《未來算法》讀後

差別于國内任何一本教科書的先算法概念、時間複雜度、連結清單、棧、隊列、樹、圖、排序等的章節結構,《未來算法》将這些零散的知識點全都打散、掰開揉碎、結合四大算法(排序、分類、搜尋、遞歸)、四大思維(分解、抽象、算法、模式識别)的脈絡講解,非常新穎。欣慰的是:本書零代碼,作者将看似複雜的算法結合現實生活衣(抽屜存放衣物類比棧)、食(炒雞蛋順序類比分解問題)、住(酒店逃生隻帶走手機問題類比貪婪算法)、行(公共汽車導航線路類比計算機抽象問題)等結合起來,其實想想這些問題我也都經曆過,但是我為什麼沒有想到?以此次元思考反觀作者,更能展現作者的細膩、缜密、細緻入微的觀察、深入淺出(作者解釋深入淺出:對于一個問題,你想透了才能真正了解)的講解,來源于生活、抽象于生活、升華于生活的見地。很多例子還會讓人感覺用的恰到好處,比如:

  • 以世界杯賭球講解二分法;
  • 以掃地機器人講解模式識别;
  • 以朋友圈講解連結清單存儲。

難能可貴的是:作者還在每一章節作為做了升華。比如:

  • 排序思維做時間管理;
  • 分類思維解除焦慮;
  • 搜尋思維找工作;
  • 模式識别方式認清本質、識别規律并預測未來。

這些都是我非常喜歡的講解方式,基于現實世界的小問題、生活中的小場景,展開論述,零公式、零代碼,引出一個個的知識點,非常引人入勝,每一小節後面還提出一些發散性問題,進一步吸引讀者思考以加深對概念的“反刍”了解。更難能可貴的是:書中有大量的、形象化的插圖輔助了解概念且作者将書中所有知識點以腦圖的一頁紙方式附贈呈現。這就是我一直提倡的知識的“點、線、面、體”的學習方式,我深知這會非常耗費時間,但,相信作者是站在高處俯瞰全局才會有了這般格局和視野,值得借鑒和學習。為便于未來的我複習,我将書中的好奇點以及感興趣的問題或定義梳理如下:

什麼是計算思維?

計算思維,簡單的說就是計算機怎麼解決世界的問題。它包括幾個部分:把複雜問題分解成簡單問題,找出重複的模式,把實體世界的資訊抽象表示成計算機能夠了解的資訊和很多約定俗成的算法。計算思維主要包括四個方面:分解問題、抽象、算法、模式識别。

  • 算法:直接解決問題的方法。
  • 分解問題、抽象、模式識别:能幫助人們用算法來表示生活中的問題。

計算思維是貫穿程式設計的底層思維,分解問題是計算思維的核心,排序算法、分類算法、搜尋算法、遞歸算法是基石,資料結構和模式識别是架構,以上支撐着未來前景無限的 AI 等領域。

計算思維四種思維之一——分解思維

拆解複雜問題,直到複雜問題成為可重複的簡單問題。分而治之、各個擊破是兵家常用的政策。分解問題就是分治法。當我們把一個大問題分解成小問題,再分解成具體的步驟之後,我們就可以用一種計算機語言把這些步驟表示出來,指導計算機做事。

計算思維四種思維之二——抽象思維

抽象就是在與計算機對話時,删除實體空間和時間細節,以集中解決關鍵的問題。把生活中的問題抽象化,用約定俗成的算法來解。抽象能力,是一種去僞存真的核心能力。我們生活中有太多的細節,雖然它們讓生活有了諸多色彩,但在解決問題方面,很多細節是不必要的。愛因斯坦說:“當你清楚的定義一個問題的時候,你已經解決了百分之九十了”。抽象是幫助我們把問題想清楚的強大工具。

計算思維四種思維之三——算法思維

計算機的算法就是一系列簡單确定的操作來完成一項标準任務。算法是計算機用來解決問題的基本單元。算法是流程化的、可調用的、邏輯清晰(足夠清晰、沒有歧義)的。算法的特性:

  • 正确性。在任何情況下都必須正确。
  • 多樣性。每個題都有多種不同的算法來解。
  • 重複性。重複執行,直到某一條件滿足後結束。
  • 完整性。僅僅正确還不夠,還要保證完整(都要覆寫到)。

計算思維四種思維之四——模式識别

模式識别,就是識别出哪些問題有共性,可以用同一個方法(比如排序)來解,這樣我們就可以把這些問題交給計算機算法,讓它重複做,做成千上萬變。對簡單的模式給予合适的輸入和輸出,可以解決複雜的問題。比如:抖音不是給一個人推薦視訊,它的算法是給一億人推薦視訊。每個人看到的内容是不一樣的,形式和方法卻是一樣的。

資料結構和算法的關系

計算機需要有一些地方存東西,計算機把這些“東西”叫資料,存放“東西”的地方和方式,就是資料結構(隊列、堆棧、鍵值對、圖等)。算法的有效性依賴于資料結構,用對了資料結構,算法就會更快、更好。

最佳停止問題

最佳停止問題的場景是:你有一系列可能選擇的目标,你可以一個一個地檢驗,記住他們的特點和優點,給他們打分。但是你看過了就不能回頭了。問題是:你什麼時候做決定,是最佳的選擇呢?這個最佳選擇的答案是:37%。也就是說,在你所有的可能選擇中,前面 37% 不要選,用來積累資料,建立你對選擇對象品質的評估标準,讓你知道什麼是好的,什麼是不好的。從第38%個開始,你就轉成開放的可以做決定的狀态。這時候,你如果遇到比前面看到的都更好的選項,你就可以做出選擇。基于作者引出最佳停止問題的定義我浮想聯翩,讓我想到 20 多年前左右撿甜瓜的場景。當時我們幾個小孩在一塊甜瓜地旁邊的路上玩,大點的甜瓜都讓瓜農大爺(種瓜的主人)收走了,隻剩下一些小的,不過由于瓜農大爺撿拾的匆忙,可能還會剩下大點的甜瓜。天快黑了,瓜農大爺說:你們小孩去裡面撿吧,但等下一輛車來了,你們就出來。實際上下一輛車也就十來分鐘的時間。這時候,我們都有一種如獲至寶的感覺,我們幾個小孩一人一趟的去找,由于是徒手,加上小孩手小,最多隻能拿一個瓜。絕大多數小孩和我一樣,明明看到有相對大的,但沒有選擇,總感覺後面可能還有更大的,最後眼看着下一輛車要來了,我們中的絕大多數小孩(包括我)隻撿了最後那一刻的那一個相對小的瓜,灰溜溜的從瓜田裡跑了出來。我印象很深,當時有一個小女孩撿到了最大的瓜。她的撿拾方法是:撿到一個相對大的瓜,就抱着不放,看後面如果有大的就換,如果沒有大的就一直抱着。當時,我就在反思:為什麼我隻撿到一個小瓜?直到今天看這本書我才恍然大悟,原來這是個最佳停止問題。故事還沒有結束,那個小女孩,後來是我的國中同班同學加同桌,再後來成為我們村裡唯一的複旦大學女博士。......

優化與最優

最優,所有可能的解裡面最佳的一個。優化,是一個動詞,是把解決方案不斷變好的過程。是計算思維的核心概念,它是計算和資料的根本差別所在,也是我們日常生活中非常有用的方法。優化的精髓是要在有限的時間内,用有限的資源找到針對一個問題的可以接受的解決方案。優化往往追求時間和空間的平衡。優化可能導緻最優解的出現,但是很多時候,隻是找到一個可以接受的比較好的解。如果我們對一件事的價值沒有想清楚,那我們應當先好好回答“什麼對我更重要”這個如何衡量的問題。

什麼是未來算法?

未來算法教你像計算機一樣思考。學會了計算思維,你可以看透物聯網世界和 AI 是怎麼運作的,你也可以學會了一種解決大規模複雜問題的方法。

這不是很有趣嗎?

對未知的好奇、對問題的好奇、對錯誤的好奇、對難題的好奇......

小結

繼續閱讀