本書是一本面向問題求解的計算機算法普及讀物。筆者挑選了24個問題,有些屬于計算機科學中的經(jīng)典,有些則來自游戲等其他領(lǐng)域的場景,旨在提供一個不同于普通算法教科書的視野。在相關(guān)求解算法的介紹上大體遵循問題導入、算法思路、算法描述和算法分析的思路,從而使得對每一個問題和算法的討論相對獨立。全書可以任意順序選讀。
本書適合受過高中及其以上教育的讀者,適合作為中學信息技術(shù)課程改革和大學計算機基礎(chǔ)課的教學參考書,也有助于曾經(jīng)學過計算機相關(guān)課程的讀者加深關(guān)于算法的認識。
(1)2020年7月,我國火星探測器天問一號發(fā)射升空,歷經(jīng)7個月的太空遨游,終于在2021年2月成功進入火星軌道。隨后,天問一號所搭載的火星車祝融號于2021年5月著陸火星,開啟了奇妙的探索之旅;鹦桥c地球相隔甚遠,祝融號與地球控制中心之間利用信號進行一次單向交流,就要花費十多分鐘的時間,所以無法完成實時控制。因此,在大部分時間里,甚至包括2021年9月由太陽阻礙導致的完全失聯(lián)的一個月,祝融號需要靠自己完成工作,比如避障、拍照、取樣分析等,這一系列工作內(nèi)容乃至整個龐大的天問一號探測工程,背后都離不開算法的支持。
(2)隨著計算機技術(shù)、人工智能技術(shù)的快速發(fā)展與應(yīng)用,我們的生活方式迎來革新。在享受人工智能帶來的益處的同時,很多人也不免會擔憂它產(chǎn)生的威脅。算法,作為前沿技術(shù)的基礎(chǔ)與核心,就是拉近人們與前沿技術(shù)的關(guān)系的關(guān)鍵點。南京大學計算機科學與技術(shù)系教授陳道蓄與北京大學計算機科學技術(shù)系教授李曉明通過多年教學與科研,積累了大量經(jīng)驗,本書就是他們在算法思維普及方面的成果。從有趣的故事、游戲或經(jīng)典的案例出發(fā),用偽代碼和Python代碼降低理解門檻,避開枯燥與復雜的描述,讓讀者仿佛在進行一個個解謎游戲,輕松地學習算法,體會算法精髓,感受算法魅力。了解算法,也能幫助讀者以更積極的態(tài)度迎接智能技術(shù)革命。
在短短幾十年的時間里,數(shù)字技術(shù)已然改變了人們的生活。如今走到哪里都能看到人們手中抓著手機,真是抓著,而不僅是隨身攜帶。有人甚至覺得只要有手機,多再加上一臺筆記本電腦,就能應(yīng)付工作、生活和休閑的全部需要。
大到從火星探測器發(fā)回圖片,小到在網(wǎng)上點餐,多樣化的計算機應(yīng)用背后都有一個共同的概念:算法。如果把迅速發(fā)展的信息化社會看作三駕馬車在奔跑,那三匹馬就是芯片、系統(tǒng)和算法。而這其中,讓人們覺得霧里看花的就是算法。App這個詞幾乎人人都能脫口而出,且能對應(yīng)到一個個明確的對象,而算法卻總有點拗口,似乎看不見、摸不著。
這是因為許多基礎(chǔ)算法盡管每天都會被用到,但它們只是整個應(yīng)用解決方案中的某些環(huán)節(jié),默默地在背后發(fā)揮作用。例如,人們在12306網(wǎng)站訂車票時無意識地就在用排序算法。另外,即使算法直接與應(yīng)用相關(guān),用戶也未必注意到隱身于系統(tǒng)之中的一小段代碼,例如,看視頻時必然會用到的壓縮算法。
通常介紹算法的書會把算法與菜譜進行類比:菜譜列出將食材和調(diào)料(輸入)加工成菜品(輸出)的步驟;計算機算法則是將輸入數(shù)據(jù)轉(zhuǎn)化為輸出數(shù)據(jù)的過程。在討論計算機算法時,數(shù)據(jù)指的是將物理世界的問題抽象為模型后的數(shù)據(jù)表示。
盡管大家都能理解講算法時提到菜譜只是類比,也能體會到計算機算法對邏輯嚴謹性的要求與菜譜顯然不同,但這樣的類比仍然會產(chǎn)生誤導,影響我們對于計算思維的認識。
人的一生甚至整個人類的歷史就是不斷解題的過程。解題過程與人類自身解題能力的提高是互相促進的演化過程,包括對人類進化的影響。人類當前的解題能力基于世世代代的知識積累以及在這個基礎(chǔ)上凝練出的智慧,前者常體現(xiàn)為有形的記錄,后者常表現(xiàn)為無形的洞悉和參悟。這些知識與智慧和人作為生物物種之一的生理特質(zhì)是密切相關(guān)的,也適合由人運用它們?nèi)ソ鉀Q問題。正如工業(yè)革命促成動力裝置大發(fā)展,極大地延伸了人的體力極限,計算機的出現(xiàn)理應(yīng)延伸人的智力極限。
不過,目前甚至可見的未來,計算機解題的能力并不來源于類人的智慧,盡管某些應(yīng)用表面上看似乎是這樣。計算機表現(xiàn)出來的能力主要還是依賴極高的算力、極大的數(shù)據(jù)量,以及過去幾十年來積累的豐富算法。中國計算機學會前理事長李國杰院士曾說過:腦科學等領(lǐng)域的成果還不能為現(xiàn)在的智能計算提供任何直接的支撐。計算思維的核心就是將人的智慧和計算機的優(yōu)勢限度地結(jié)合起來,實現(xiàn)這一目標的途徑就是算法,目前的人工智能也是依賴算法進步的。一些因效率太低或風險太高而不被看好的人工解題方法,如窮盡搜索、試錯等,卻可能引導人們提出非常好的計算機算法。
隨著智能技術(shù)的進步,人工智能對人類的威脅逐漸成為熱門話題之一。一個經(jīng)常被提及的論點是:人類的學習過程很慢,機器學習效率則提高得很快,因此不久后機器智能將超過人類。機器在棋類比賽中戰(zhàn)勝世界冠軍已足夠讓世人震驚,在以自然語言為媒介的電視問答大賽中機器也戰(zhàn)勝了人類高手,這更讓人覺得通用、自主的強人工智能帶來的威脅就在眼前。
但這里似乎忽略了一個問題:人的學習曲線是否能改進?更具體地說,能不能利用機器智能改進人的學習效率?其實我們現(xiàn)在的教學模式是在計算機出現(xiàn)之前歷經(jīng)千百年形成的,即在知識總結(jié)的基礎(chǔ)上構(gòu)建體系,開發(fā)課程,然后按照課程進行教學,通常也能在學習者的大腦中重構(gòu)相同的體系。這個過程側(cè)重于知識的梳理和傳遞。至于將人類智慧融入教學,似乎更依賴于學習者的悟道。中國流行的古話修行在個人顯然表明老師對怎么能讓學生真正悟出道考慮得并不多。
人們對于機器智能發(fā)展的顧慮顯然是因為機器已經(jīng)從數(shù)據(jù)處理進化到了知識處理的階段。與機器比賽知識處理,人類似乎不是對手。人類的學習過程必須從重知識傳遞轉(zhuǎn)向重知識駕馭能力,可是學習模式進化遲緩。雖然計算機已廣泛應(yīng)用于教學,且近兩年線上教學得到廣泛采用,但坦率地說,教學模式并沒有根本變化,多數(shù)還只是將傳統(tǒng)課程遷移到了網(wǎng)上。
幾十年前,管理信息化興起之時,人們首先是將各種管理數(shù)據(jù)和表格電子化。但很快,人們就認識到,不改變管理模式不可能真正實現(xiàn)管理信息化。今天,對于教育人類面臨同樣的問題:什么樣的教育模式才真正面向未來?如何使現(xiàn)在培養(yǎng)的人才不會很快被機器所替代?對計算機領(lǐng)域而言,積極發(fā)展智能技術(shù),同時讓學生主動探索如何利用機器智能更好地提升人類智慧,努力探索如何改進人類的學習曲線,方為面對技術(shù)發(fā)展的積極態(tài)度。當前具體著眼點應(yīng)該包括充分理解計算環(huán)境的變化,以及培養(yǎng)學生與時俱進的算法設(shè)計能力。
科學普及往往沒有正規(guī)科學技術(shù)教育那么明確的領(lǐng)域針對性,它一直是科技教育中不顯眼但卻具有持續(xù)意義的環(huán)節(jié),對激發(fā)人特別是青少年的創(chuàng)造潛力有不可替代的作用。早在1826年,法拉第在英國皇家學會倡導了面向社會公眾的圣誕科學演說,該活動一直延續(xù)至今,成為科學家服務(wù)于科學普及的典范。與自然科學、數(shù)學等學科相比,計算機科學技術(shù)的歷史還非常短,其科普則更加滯后。但計算機技術(shù)的應(yīng)用從深度、廣度和滲透速度而言都是其他學科無法比擬的。2008年的圣誕科學演說邀請了曾任英國皇家學會副主席的計算機科學家Chris Bishop進行演講,他強調(diào)了計算機算法普及的意義和迫切性。
本書是我們在算法思維普及方面嘗試的成果。目標是讓廣大讀者理解無處不在的計算機和網(wǎng)絡(luò)應(yīng)用背后的核心思想,體會當談及算法的時候應(yīng)該關(guān)心哪些問題。我們通過一些例子的鋪陳,希望讀者能夠意識到人所主導的計算機解題關(guān)鍵在于用人的智慧充分發(fā)揮計算機的長處,延伸人類的智力極限。這不同于傳統(tǒng)的解題思想,它應(yīng)能支持我們以更積極的態(tài)度迎接智能技術(shù)革命。
本書適合受過高中及其以上教育,對數(shù)學和計算機有興趣的讀者,適合作為大學計算機基礎(chǔ)課和中學信息技術(shù)課程改革的教學參考書,也有助于曾經(jīng)學過計算機相關(guān)課程的讀者刷新關(guān)于算法的認識。
俗話說:多一個數(shù)學公式就會少一半讀者。本書的內(nèi)容決定了不可能完全回避數(shù)學公式和代碼。我們將本書定位于中級科普,既讓一般讀者領(lǐng)略計算機解題帶來的樂趣,又能為有志于將來在計算機科學領(lǐng)域繼續(xù)探索的青少年讀者提供前進的跳板。在討論問題及其解法時,我們回避嚴格的數(shù)學推導,但不回避對正確性和復雜性的分析。算法描述原則上采用偽代碼,部分代碼涉及細節(jié),可能形式上更像Python語言。不過初學者應(yīng)該記住:算法,代碼第二。我們在合適的地方也會提供一些可進一步探討或與程序?qū)崿F(xiàn)相關(guān)的問題與建議,希望有助于啟發(fā)讀者的思考。
本書名為《算法漫步》,雖然內(nèi)容分為四篇,但不具有學術(shù)或技術(shù)上的分類含義,只是按照內(nèi)容粗略劃分,以方便閱讀。讀者可以按照興趣任意選擇閱讀順序和方式,當然我們希望讀者對每部分都有興趣?紤]到本書讀者的背景不同,我們也從算法邏輯、程序與數(shù)據(jù)結(jié)構(gòu),以及數(shù)學知識三方面,提供了關(guān)于本書24個問題的難度標記,供選讀時參考。
我們在計算機教育領(lǐng)域工作多年,盡管在計算機教學與科研方面略有積累,但深知寫出好的科普作品實非易事,既要易于讀者理解,又不能在核心的科學技術(shù)內(nèi)容上產(chǎn)生誤導。本書一定存在瑕疵,希望得到廣大讀者的批評指正。我們在這本書上的努力算是拋磚引玉,期望今后能看到更多在計算機領(lǐng)域有所建樹的學者、教師關(guān)注計算思維的科普,產(chǎn)生更多優(yōu)秀作品,為創(chuàng)建適合智能時代的新教學模式提供啟發(fā)。
陳道蓄,南京大學計算機科學與技術(shù)系教授。從事計算機軟件教學與科研工作四十年,承擔算法類基礎(chǔ)課教學任務(wù)多年。因計算機核心基礎(chǔ)課程教學改革成果獲教學成果獎二等獎;因泛在計算平臺技術(shù)研究成果獲江蘇省科技獎一等獎。曾獲中國計算機學會杰出教育獎、南京大學教學終身成就獎,三次被學生推選為南京大學我*喜愛的教師。
李曉明,北京大學瑞聲慕課講席教授,中國計算機學會會士。曾因主持研發(fā)中國高校影響力*大的搜索引擎天網(wǎng)搜索獲中國計算機學會王選獎;因創(chuàng)設(shè)與推廣交叉學科課程社會科學中的計算思維方法獲北京市教學成果一等獎;因倡導與推動慕課在中國的興起與發(fā)展獲中國計算機學會杰出教育獎、中國教師發(fā)展基金會杰出教學獎。
前言
章節(jié)內(nèi)容難度標記說明
第 1 篇 游戲與算法 ...............................1
1 量水問題 .......................................2
2 一筆畫問題 .....................................9
3 迷宮問題 ......................................17
4 拼塊游戲 ......................................27
5 對弈游戲 ......................................38
第 2 篇 計算機基礎(chǔ)算法 ..........................45
6 查找 ..........................................46
7 排序 ..........................................55
8 連通 ..........................................64
9 連通的代價 ....................................75
10 數(shù)據(jù)壓縮 .....................................84
11 短路徑 .....................................94
12 流量 ....................................106
13 凸包計算 ....................................117
第 3 篇 生活中的算法 ...........................127
14 選舉 ........................................128
15 分類 ........................................137
16 聚類 ........................................147
17 投資 ........................................157
18 匹配 ........................................167
19 調(diào)度 ........................................176
20 密碼 ........................................188
21 社會網(wǎng)絡(luò) ....................................197
第 4 篇 算術(shù)和代數(shù)問題 .........................207
22 斐波那契數(shù)列 ................................208
23 大數(shù)乘法三解 ................................215
24 高次方程求解 ................................223
參考文獻 ........................................232
后記 ............................................234