《啊哈!算法》是一本充滿智慧和趣味的算法入門書。沒有枯燥的描述,沒有難懂的公式,一切以實際應用為出發(fā)點,通過幽默的語言配以可愛的插圖來講解算法。你更像是在閱讀一個個輕松的小故事或是在玩一把趣味解謎游戲,在輕松愉悅中便掌握算法精髓,感受算法之美。
《啊哈!算法》中涉及的數(shù)據(jù)結構有棧、隊列、鏈表、樹、并查集、堆和圖等;涉及的算法有排序、枚舉、深度和廣度優(yōu)先搜索、圖的遍歷,當然還有圖論中不可以缺少的四種最短路徑算法、兩種最小生成樹算法、割點與割邊算法、二分圖的匹配算法等。
啊哈!去中科院玩單片機
呦吼!在微軟亞洲研究院寫爬蟲
噠噠!寫一本開開心心的算法書
你一定能看懂的算法書!
作為本書的策劃編輯,我很榮幸。
《啊哈!算法》是我讀過的有趣且是我能輕松看懂的一本算法書。
我起初是因為啊哈磊寫的另外一本書《啊哈!C》而認識啊哈磊的。啊哈磊還有個網(wǎng)站,也叫啊哈磊,這個啊哈磊網(wǎng)站中有個論壇,叫啊哈論壇。論壇建立短短一年半時間,就聚集了15000多個啊哈小伙伴,都是萌物。我對他的寫作風格很欣賞,那是一種因熱愛和探究而產(chǎn)生的純粹的快樂,因此,當啊哈磊率領著他的一大波萌物開開心心地攻城略地,浩浩蕩蕩地兵臨城下,跟我說他想寫一本通俗易懂的算法書,不知是否能出版時,我的回答是:“必須出版!”
這本書出版意向的達成就是這么簡單。
但創(chuàng)作的過程一點不輕松。因為任何一本拿得出手的書的創(chuàng)作都是作者大量時間和精力付出的結果。是毅力的累積。
幾個月之后,我拿到了這本書的初稿。我高高興興地開始讀。這部分寫得通俗易懂,我看得津津有味。但讀了一些之后,我發(fā)現(xiàn)我高興不起來了,我遇到了困難,有些篇章寫得太簡略了,只是把算法的基本思路說了一下,然后就直接給出了以該算法實現(xiàn)的某個示例的完整代碼。
這樣不行,看不懂啊。原理很簡單,但實現(xiàn)起來時,看代碼就感覺對應不起來了。或許比我聰明的人能看懂,但我希望像我這種在算法方面毫無造詣的普通選手讀起來也不吃力,于是我讓啊哈磊完善它。我是這么交代的——你得寫得讓我能看懂才行。這要求非常的簡單,但也非常的暗黑。
經(jīng)過比我想象的要長的時間,啊哈磊給了我第二版。
我繼續(xù)閱讀,很多之前看不懂的地方現(xiàn)在能看懂了,或者至少我認為我看懂了(請允許我使用這種讓人生氣的措辭),但還有少部分欠點勁兒。啊哈磊向我投來困惑又略帶鄙視的目光,我用堅定又癡癡呆呆的目光把他的目光給頂了回去。
于是啊哈磊繼續(xù)埋頭苦干。
終于,我可以看懂的版本誕生了。
對于一本技術書,一個編輯可能犯下的“錯誤”就是試圖去讀懂它。
我還要特別強調(diào)一點,這本書不僅寫得通俗易懂,而且還在一個非常重要的方方面超越了其他技術書,那就是這本書中還配了可愛的漫畫,萌萌的畫風,生動的場景,與文字渾然一體。
紀磊
網(wǎng)名啊哈磊。
曾在中科院玩過單片機。武漢大學歷史上及時位以本科生身份加入MSRA(微軟亞洲研究院)的小伙伴,在機器學習組從事搜索引擎方面的研究。
發(fā)表國際會議論文一篇(IEEE)。
全國青少年信息學奧林匹克金牌教練。
超萌超簡潔的C語言編譯器——“啊哈C編譯器”作者。
2013年,我的及時部著作,有趣的編程科普書《啊哈C!》出版。
非常喜歡小朋友,每天都過得都非常開心。
至于為什么叫“啊哈磊”,因為我覺得這是一個很喜慶的名字。
目錄
第1章一大波數(shù)正在靠近——排序1
第1節(jié)最快最簡單的排序——桶排序2
第2節(jié)鄰居好說話——冒泡排序7
第3節(jié)最常用的排序——快速排序12
第4節(jié)小哼買書20
第2章棧、隊列、鏈表25
第1節(jié)解密QQ號——隊列26
第2節(jié)解密回文——棧32
第3節(jié)紙牌游戲——小貓釣魚35
第4節(jié)鏈表44
第5節(jié)模擬鏈表54
第3章枚舉!很暴力57
第1節(jié)坑爹的奧數(shù)58
第2節(jié)炸彈人61
第3節(jié)火柴棍等式67
第4節(jié)數(shù)的全排列70
第4章萬能的搜索72
第1節(jié)不撞南墻不回頭——深度優(yōu)先搜索73
第2節(jié)解救小哈81
第3節(jié)層層遞進——廣度優(yōu)先搜索88
第4節(jié)再解炸彈人95
第5節(jié)寶島探險106
第6節(jié)水管工游戲117
第5章圖的遍歷128
第1節(jié)深度和廣度優(yōu)先究竟是指啥129
第2節(jié)城市地圖——圖的深度優(yōu)先遍歷136
第3節(jié)最少轉(zhuǎn)機——圖的廣度優(yōu)先遍歷142
第6章最短路徑147
第1節(jié)只有五行的算法——Floyd-Warshall148
第2節(jié)Dijkstra算法——通過邊實現(xiàn)松弛155
第3節(jié)Bellman-Ford——解決負權邊163
第4節(jié)Bellman-Ford的隊列優(yōu)化171
第5節(jié)最短路徑算法對比分析177
第7章神奇的樹178
第1節(jié)開啟“樹”之旅179
第2節(jié)二叉樹183
第3節(jié)堆——神奇的優(yōu)先隊列185
第4節(jié)擒賊先擒王——并查集200
第8章更多精彩算法211
第1節(jié)鏢局運鏢——圖的最小生成樹212
第2節(jié)再談最小生成樹219
第3節(jié)重要城市——圖的割點229
第4節(jié)關鍵道路——圖的割邊234
第5節(jié)我要做月老——二分圖較大匹配237
第9章還能更好嗎——微軟亞洲研究院面試243
序 我想寫一本通俗易懂的算法書很久了,因為對于多數(shù)人而言,“算法”給他的及時印象就是很難懂,其實我也是這樣。還記得我及時次學習圖論的“割點割邊”算法時,看過不下于四五本書,其中不乏一些算法經(jīng)典書籍,還百度了一堆材料,才勉強將其看懂并實現(xiàn)成代碼。其實這個算法并不難,核心代碼不超過20行,但是很多算法書都是草草敘述,不同的書籍給出的參考代碼也是五花八門,有的甚至都不稀罕給你代碼,這大大增加了學習的難度。我是花了整整一個晚上才搞定的,當然這其中不排除智商因素。第二印象就是算法是枯燥無趣的,并且好像沒什么作用。其實在我們的日常生活之中到處都可見到算法的影子,只不過它通常隱匿在事物的背后,不太容易被發(fā)現(xiàn)。但是它每天都在默默地為我們服務著。在本書中我將帶你一步步揭開算法的奧秘,帶它走近你的身邊。
由于算法的內(nèi)容確實是太多了,要想全部寫清楚恐怕幾本書都不夠,本書將介紹一些最常用的算法。此外算法的實現(xiàn)通常需要依附一些數(shù)據(jù)結構,因此在必要的時候?qū)τ谛枰玫降臄?shù)據(jù)結構我也會進行講解。本書中涉及到的數(shù)據(jù)結構有棧、隊列、樹、并查集、堆和圖等;算法有各種排序、枚舉、深度和廣度優(yōu)先搜索、圖上的遍歷,當然還有圖論中不可以缺少的四種最短路徑算法、兩種最小生成樹算法、割點與割邊算法、二分圖的較大匹配算法等。
盡管我不敢保障我寫的算法你一定可以看懂(但憑著一股強大的自信,我認為初中以上文化程度的應該沒問題^_^),但我會以一個故事或者一個你在生活中可能遇到的問題開始對一個算法進行講解,并盡量用通俗易懂的語言配合有趣的插圖讓你在閱讀本書的時候更像是在品讀一篇篇輕松的短篇小說或是在玩一把趣味解謎游戲,在輕松愉悅中掌握算法精髓,感受算法之美。
致謝 本書能得以面世,首先要感謝圖靈的陳冰先生。感謝你主動聯(lián)系我,給予我信心去完成本書的全部,并且提出了很多寶貴的建議。更加令我吃驚的是你竟然能讀懂本書的全部算法(包括每一行代碼),還發(fā)現(xiàn)了很多隱藏得很深的錯誤,真是一位非常棒的圖書出版人。
在書稿創(chuàng)作的過程中,有幸和很多的學生共同學習和探討,是他們?yōu)楸緯膭?chuàng)作提供了靈感,感謝他們的傾聽、交流和建議。他們是武漢二中的呂凱風同學、武漢外國語學校的李嘉浩、熊子健、陳雨禾、郭明達和李丁等同學。
本書之所以變得這么有趣,還必須要感謝我的美女插畫師鄭佳茜,你靈感涌現(xiàn)的插圖功不可沒。
感謝我的好友張知嚴,無私地幫助我搭建了“添柴”編程在線學習系統(tǒng)(tianchai.org),為本書讀者提供了更好的學習交流平臺。
感謝我的學生胡夢清,感謝你排除萬難來參加你人生中的一場NOIP競賽。是你用行動、青春路上追求夢想的精神,告訴我們18歲就應該可愛、執(zhí)著、不畏懼,敢于朝著夢想前行。
特別感謝我的未婚妻Snowin,是你放棄了近一年來所有的周末和節(jié)假日,陪我在書桌旁、咖啡廳里、旅途中……共同完成了本書的每一個字、每一幅圖、每一段代碼。
要感謝我的父母,你們把我拉扯大太不容易了,我愛你們!
啊哈磊
2014年5月6日
第1節(jié)最快最簡單的排序——桶排序 在我們生活的這個世界中到處都是被排序過的東東。站隊的時候會按照身高排序,考試的名次需要按照分數(shù)排序,網(wǎng)上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東東都需要排序,可以說排序是無處不在。現(xiàn)在我們舉個具體的例子來介紹一下排序算法。
首先出場的是我們的主人公小哼,上面這個可愛的娃就是啦。期末考試完了老師要將同學們的分數(shù)按照從高到低排序。小哼的班上只有5個同學,這5個同學分別考了5分、3分、5分、2分和8分,哎,考得真是慘不忍睹(滿分是10分)。接下來將分數(shù)進行從大到小排序,排序后是8 5 5 3 2。你有沒有什么好方法編寫一段程序,讓計算機隨機讀入5個數(shù)然后將這5個數(shù)從大到小輸出?請先想一想,至少想15分鐘再往下看吧(^__^)。
我們這里只需借助一個一維數(shù)組就可以解決這個問題。請確定你真的仔細想過再往下看哦。
首先我們需要申請一個大小為11的數(shù)組int a[11]。OK,現(xiàn)在你已經(jīng)有了11個變量,編號從a[0]~a[10]。剛開始的時候,我們將a[0]~a[10]都初始化為0,表示這些分數(shù)還都沒有人得過。例如a[0]等于0就表示目前還沒有人得過0分,同理a[1]等于0就表示目前還沒有人得過1分……a[10]等于0就表示目前還沒有人得過10分。
下面開始處理每一個人的分數(shù),及時個人的分數(shù)是5分,我們就將相對應的a[5]的值在原來的基礎增加1,即將a[5]的值從0改為1,表示5分出現(xiàn)過了一次。
第二個人的分數(shù)是3分,我們就把相對應的a[3]的值在原來的基礎上增加1,即將a[3]的值從0改為1,表示3分出現(xiàn)過了一次。
注意啦!第三個人的分數(shù)也是5分,所以a[5]的值需要在此基礎上再增加1,即將a[5]的值從1改為2,表示5分出現(xiàn)過了兩次。
按照剛才的方法處理第四個和第五個人的分數(shù)。最終結果就是下面這個圖啦。
你發(fā)現(xiàn)沒有,a[0]~a[10]中的數(shù)值其實就是0分到10分每個分數(shù)出現(xiàn)的次數(shù)。接下來,我們只需要將出現(xiàn)過的分數(shù)打印出來就可以了,出現(xiàn)幾次就打印幾次,具體如下。
a[0]為0,表示“0”沒有出現(xiàn)過,不打印。
a[1]為0,表示“1”沒有出現(xiàn)過,不打印。
a[2]為1,表示“2”出現(xiàn)過1次,打印2。
a[3]為1
這本書是我讀過最有趣的一本算法書了,它率領著一大波萌物改造你的思維。當我讀到啊哈磊寫的第一本書的時候,我就覺得啊哈磊很不簡單,因為它寫的編程書讓我有了編程思維。現(xiàn)在啊哈磊又出了另一本C語言的算法書,這本算法書語言活潑,圖片穿插,讓我覺得這不是一本普通的書。 奉上一句話:每個人都應該學習如何編程,因為它教會你如何思考。
盡量用通俗易懂的語言介紹數(shù)據(jù)結構和算法,看出作者的用心~也像作者說的,要掌握的話但終歸還得靠自己多思考多實踐,多多編程才是正道~
是學習算法的經(jīng)典書籍,風趣幽默,很好很喜歡!值得很多學習算法和數(shù)據(jù)結構的初學者閱讀!
首先給我的第一感覺,我想用“活潑”這個詞來形容!第一點,內(nèi)容要點中穿插了卡通圖片 和字符表情,這一點讓人覺得比較活潑,輕松的感覺。第二點,就是溝通對話式語言,說道 要點重點時,書中就像是個老師或者朋友一樣告訴你“注意啦!”。語言活潑,圖片穿插,讓你忘記你是在看一本復雜的算法書,漫畫式算法書。不錯。
沒得說,真的是一本好書,沒有仔細看,只是翻的看了看,就感覺學算法一點都不枯燥,我覺得大學專業(yè)如果用這種書,上課還怎么會有睡覺的人,好評!希望越做越幫!
嗯,很好,內(nèi)容包括了數(shù)據(jù)結構和算法,適合參加noip的學生
啊哈!算法,之前看簡介覺得很里面內(nèi)容應該挺幽默風趣的,想著能夠用一種輕松的方式學算法,就買了下來。還沒有正式學習~加油~
一開始我還是以為是JAVA的,內(nèi)容是C語音的算法的
啊哈!算法啊哈!算法啊哈!算法啊哈!算法啊A哈!算法 小哼買書8A 第章 棧、隊列K、鏈表 第節(jié) 解密號——隊列 第節(jié) 解密回文——棧 第節(jié) 紙牌10N游戲——小貓第節(jié)I 最快最簡單的排序——桶排序 N第F8節(jié) 鄰居好說話——冒泡排序 8第節(jié) 最常用的排序——快速排序 第節(jié)再談最小生成樹 第節(jié) 重要城市——圖的割點 第節(jié) 10關鍵道路——圖的割M邊 第節(jié) 我要做月老——二分圖最向我投來困惑又略帶鄙視的目光,我用堅定又癡癡呆呆88的目光把他的目光給頂了回去。于是啊哈磊繼續(xù)埋頭苦干。中便掌握J算法精髓,感受算G法之美。 《啊哈!算法》中涉及的數(shù)據(jù)結構有棧、隊列R、鏈表、樹N、并查集、堆和啊哈!算法章 最短路徑 第節(jié) 只有五行的算法—— 第節(jié) 算O法——8單源2最短路第節(jié) ——解決負權邊 第節(jié) 的隊列優(yōu)啊哈!算法,叫啊哈論10壇。論壇建立短短一年半時間,就聚集了多個啊哈小伙伴,都是萌物。我對他的寫作風格很欣賞,那是啊哈!算法簡單,但也非常的暗黑。經(jīng)過比我想象的要長的時間,啊哈磊給了我第二版4。我繼續(xù)閱讀,很多之前看不懂的地6方啊哈!算法啊哈!算法啊哈!算法再談最小生成樹 第節(jié) 重要城市——圖的割點
很好的算法書,算是算法入門中簡單易懂的了!值!
第一次看到這么有趣的算法書,學算法終于不枯燥了
一本不同于其他介紹算法的書籍,第一次看到國內(nèi)這么有趣的算法書籍,其中的算法講解非常到位,通過卡通漫畫將算法用非常形象的方式表達出來,通俗易懂,這下學習算法的朋友不用再覺得枯燥了。有心的是作者還專門為讀者設計了答題窗口和在線答題測評網(wǎng)站,能將高大上的算法用如此方式闡述出來,并注重讀者的反饋,啊哈磊必定是用心頗多,真心希望國內(nèi)有更多這樣作者和書籍。
內(nèi)容講起來比較生動有趣,大部分的圖畫人物也很可愛,總體來講,通俗易懂適合作為算法初級入門的書來看。
這樣描述算法很好,雖然寫的比較淺,但是學懂了就有性趣去研究算法導論了
寫的很好,語內(nèi)容難易適中,言幽默,但不太嚴肅。不適合做參考資料,不過學著玩到可以。太簡單也不是太好。不宜增強理解力。總體來說這書不錯,適合剛接觸算法的人。
用淺顯的方式講解算法,是難得的算法入門教材。在算法的登山路上,增加了很多級矮矮的臺階,邁不了大步的人也可以走了。
非常不錯的算法入門讀物。能淺顯易懂的理解一些復雜的算法。
能將枯燥的算法講懂,講透,講有趣,確實是一本不錯的算法書。
啊哈!算法基本思路2說了一下,然后就直接給出了以該算法實現(xiàn)的某個示例的P完整代2碼。這樣不行,看不懂啊。原理
想比較之下,這本書的質(zhì)量和內(nèi)容是在是不如《啊哈C》,也許是算法本身就比較難理解的原因,作者講的也并不是游刃有余,算法還是需要買一本權威的厚書自己慢慢啃的
新穎的趣圖和俗文結合的方式和以往算法說的苦澀相比更像是再讀推理小說。和以前的大話樹結構相比,個人更喜歡這本的講解方式,多了有趣和容易理解的插圖,畢竟圖比文字更容易讓人理解。圖靈出版的書籍一向都比較的贊啊!
這本書真心不錯,很喜歡啊哈磊寫的這本啊哈算法,真的很好,從前從來沒有像現(xiàn)在這樣喜歡算法,希望自己以后從事技術開發(fā)的工作!也希望啊哈磊能夠?qū)懚帱c兒這樣有用又有趣的書籍!
啊哈算法,不錯,經(jīng)典,有趣,正在學習中。贊一個。啊哈算法,不錯,經(jīng)典,有趣,正在學習中。贊一個。啊哈算法,不錯,經(jīng)典,有趣,正在學習中。贊一個。啊哈算法,不錯,經(jīng)典,有趣,正在學習中。贊一個。啊哈算法,不錯,經(jīng)典,有趣,正在學習中。贊一個。
算法是硬件的第二語言,好好學習算法肯定有好處
據(jù)說算法課我們很多學長學姐都栽了。我想如果這是教材,他們大概會栽在教材上吧。非常好的一本書,雖然不全面,但是體現(xiàn)了算法的趣味性。作為算法的入門書籍已經(jīng)綽綽有余了。
說實話,這本書作為算法入門還是不錯的,比較有趣,插圖也比較新穎,很好的講解了算法的一些知識。每個算法都有完整的代碼,不過每本書都不是完美的,算法稍微少了點,比較深入的話建議算法導論,這次買書沖著作者來的。對于新手或者入門的code還是值得一看的!
首先很喜歡這個名字,雖然沒有算法導論算法入門指導這種特別官方正式名字,但也正式這種略帶調(diào)侃方式的命名,可以使讀者遠離對算法的畏懼。整體上說,看完這本書可以真正喜歡上算法。