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