《啊哈!算法》是一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜游戏,在轻松愉悦中便掌握算法精髓,感受算法之美。
《啊哈!算法》中涉及的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及的算法有排序、枚举、深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、割点与割边算法、二分图的匹配算法等。
啊哈!去中科院玩单片机
呦吼!在微软亚洲研究院写爬虫
哒哒!写一本开开心心的算法书
你一定能看懂的算法书!
作为本书的策划编辑,我很荣幸。
《啊哈!算法》是我读过的有趣且是我能轻松看懂的一本算法书。
我起初是因为啊哈磊写的另外一本书《啊哈!C》而认识啊哈磊的。啊哈磊还有个网站,也叫啊哈磊,这个啊哈磊网站中有个论坛,叫啊哈论坛。论坛建立短短一年半时间,就聚集了15000多个啊哈小伙伴,都是萌物。我对他的写作风格很欣赏,那是一种因热爱和探究而产生的纯粹的快乐,因此,当啊哈磊率领着他的一大波萌物开开心心地攻城略地,浩浩荡荡地兵临城下,跟我说他想写一本通俗易懂的算法书,不知是否能出版时,我的回答是:“必须出版!”
这本书出版意向的达成就是这么简单。
但创作的过程一点不轻松。因为任何一本拿得出手的书的创作都是作者大量时间和精力付出的结果。是毅力的累积。
几个月之后,我拿到了这本书的初稿。我高高兴兴地开始读。这部分写得通俗易懂,我看得津津有味。但读了一些之后,我发现我高兴不起来了,我遇到了困难,有些篇章写得太简略了,只是把算法的基本思路说了一下,然后就直接给出了以该算法实现的某个示例的完整代码。
这样不行,看不懂啊。原理很简单,但实现起来时,看代码就感觉对应不起来了。或许比我聪明的人能看懂,但我希望像我这种在算法方面毫无造诣的普通选手读起来也不吃力,于是我让啊哈磊完善它。我是这么交代的——你得写得让我能看懂才行。这要求非常的简单,但也非常的暗黑。
经过比我想象的要长的时间,啊哈磊给了我第二版。
我继续阅读,很多之前看不懂的地方现在能看懂了,或者至少我认为我看懂了(请允许我使用这种让人生气的措辞),但还有少部分欠点劲儿。啊哈磊向我投来困惑又略带鄙视的目光,我用坚定又痴痴呆呆的目光把他的目光给顶了回去。
于是啊哈磊继续埋头苦干。
终于,我可以看懂的版本诞生了。
对于一本技术书,一个编辑可能犯下的“错误”就是试图去读懂它。
我还要特别强调一点,这本书不仅写得通俗易懂,而且还在一个非常重要的方方面超越了其他技术书,那就是这本书中还配了可爱的漫画,萌萌的画风,生动的场景,与文字浑然一体。
纪磊
网名啊哈磊。
曾在中科院玩过单片机。武汉大学历史上及时位以本科生身份加入MSRA(微软亚洲研究院)的小伙伴,在机器学习组从事搜索引擎方面的研究。
发表国际会议论文一篇(IEEE)。
全国青少年信息学奥林匹克金牌教练。
超萌超简洁的C语言编译器——“啊哈C编译器”作者。
2013年,我的及时部著作,有趣的编程科普书《啊哈C!》出版。
非常喜欢小朋友,每天都过得都非常开心。
至于为什么叫“啊哈磊”,因为我觉得这是一个很喜庆的名字。
目录
第1章一大波数正在靠近——排序1
第1节最快最简单的排序——桶排序2
第2节邻居好说话——冒泡排序7
第3节最常用的排序——快速排序12
第4节小哼买书20
第2章栈、队列、链表25
第1节解密QQ号——队列26
第2节解密回文——栈32
第3节纸牌游戏——小猫钓鱼35
第4节链表44
第5节模拟链表54
第3章枚举!很暴力57
第1节坑爹的奥数58
第2节炸弹人61
第3节火柴棍等式67
第4节数的全排列70
第4章万能的搜索72
第1节不撞南墙不回头——深度优先搜索73
第2节解救小哈81
第3节层层递进——广度优先搜索88
第4节再解炸弹人95
第5节宝岛探险106
第6节水管工游戏117
第5章图的遍历128
第1节深度和广度优先究竟是指啥129
第2节城市地图——图的深度优先遍历136
第3节最少转机——图的广度优先遍历142
第6章最短路径147
第1节只有五行的算法——Floyd-Warshall148
第2节Dijkstra算法——通过边实现松弛155
第3节Bellman-Ford——解决负权边163
第4节Bellman-Ford的队列优化171
第5节最短路径算法对比分析177
第7章神奇的树178
第1节开启“树”之旅179
第2节二叉树183
第3节堆——神奇的优先队列185
第4节擒贼先擒王——并查集200
第8章更多精彩算法211
第1节镖局运镖——图的最小生成树212
第2节再谈最小生成树219
第3节重要城市——图的割点229
第4节关键道路——图的割边234
第5节我要做月老——二分图较大匹配237
第9章还能更好吗——微软亚洲研究院面试243
序 我想写一本通俗易懂的算法书很久了,因为对于多数人而言,“算法”给他的及时印象就是很难懂,其实我也是这样。还记得我及时次学习图论的“割点割边”算法时,看过不下于四五本书,其中不乏一些算法经典书籍,还百度了一堆材料,才勉强将其看懂并实现成代码。其实这个算法并不难,核心代码不超过20行,但是很多算法书都是草草叙述,不同的书籍给出的参考代码也是五花八门,有的甚至都不稀罕给你代码,这大大增加了学习的难度。我是花了整整一个晚上才搞定的,当然这其中不排除智商因素。第二印象就是算法是枯燥无趣的,并且好像没什么作用。其实在我们的日常生活之中到处都可见到算法的影子,只不过它通常隐匿在事物的背后,不太容易被发现。但是它每天都在默默地为我们服务着。在本书中我将带你一步步揭开算法的奥秘,带它走近你的身边。
由于算法的内容确实是太多了,要想全部写清楚恐怕几本书都不够,本书将介绍一些最常用的算法。此外算法的实现通常需要依附一些数据结构,因此在必要的时候对于需要用到的数据结构我也会进行讲解。本书中涉及到的数据结构有栈、队列、树、并查集、堆和图等;算法有各种排序、枚举、深度和广度优先搜索、图上的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、割点与割边算法、二分图的较大匹配算法等。
尽管我不敢保障我写的算法你一定可以看懂(但凭着一股强大的自信,我认为初中以上文化程度的应该没问题^_^),但我会以一个故事或者一个你在生活中可能遇到的问题开始对一个算法进行讲解,并尽量用通俗易懂的语言配合有趣的插图让你在阅读本书的时候更像是在品读一篇篇轻松的短篇小说或是在玩一把趣味解谜游戏,在轻松愉悦中掌握算法精髓,感受算法之美。
致谢 本书能得以面世,首先要感谢图灵的陈冰先生。感谢你主动联系我,给予我信心去完成本书的全部,并且提出了很多宝贵的建议。更加令我吃惊的是你竟然能读懂本书的全部算法(包括每一行代码),还发现了很多隐藏得很深的错误,真是一位非常棒的图书出版人。
在书稿创作的过程中,有幸和很多的学生共同学习和探讨,是他们为本书的创作提供了灵感,感谢他们的倾听、交流和建议。他们是武汉二中的吕凯风同学、武汉外国语学校的李嘉浩、熊子健、陈雨禾、郭明达和李丁等同学。
本书之所以变得这么有趣,还必须要感谢我的美女插画师郑佳茜,你灵感涌现的插图功不可没。
感谢我的好友张知严,无私地帮助我搭建了“添柴”编程在线学习系统(tianchai.org),为本书读者提供了更好的学习交流平台。
感谢我的学生胡梦清,感谢你排除万难来参加你人生中的一场NOIP竞赛。是你用行动、青春路上追求梦想的精神,告诉我们18岁就应该可爱、执着、不畏惧,敢于朝着梦想前行。
特别感谢我的未婚妻Snowin,是你放弃了近一年来所有的周末和节假日,陪我在书桌旁、咖啡厅里、旅途中……共同完成了本书的每一个字、每一幅图、每一段代码。
要感谢我的父母,你们把我拉扯大太不容易了,我爱你们!
啊哈磊
2014年5月6日
第1节最快最简单的排序——桶排序 在我们生活的这个世界中到处都是被排序过的东东。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。
首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦。期末考试完了老师要将同学们的分数按照从高到低排序。小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎,考得真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序,排序后是8 5 5 3 2。你有没有什么好方法编写一段程序,让计算机随机读入5个数然后将这5个数从大到小输出?请先想一想,至少想15分钟再往下看吧(^__^)。
我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。
首先我们需要申请一个大小为11的数组int a[11]。OK,现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。例如a[0]等于0就表示目前还没有人得过0分,同理a[1]等于0就表示目前还没有人得过1分……a[10]等于0就表示目前还没有人得过10分。
下面开始处理每一个人的分数,及时个人的分数是5分,我们就将相对应的a[5]的值在原来的基础增加1,即将a[5]的值从0改为1,表示5分出现过了一次。
第二个人的分数是3分,我们就把相对应的a[3]的值在原来的基础上增加1,即将a[3]的值从0改为1,表示3分出现过了一次。
注意啦!第三个人的分数也是5分,所以a[5]的值需要在此基础上再增加1,即将a[5]的值从1改为2,表示5分出现过了两次。
按照刚才的方法处理第四个和第五个人的分数。最终结果就是下面这个图啦。
你发现没有,a[0]~a[10]中的数值其实就是0分到10分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体如下。
a[0]为0,表示“0”没有出现过,不打印。
a[1]为0,表示“1”没有出现过,不打印。
a[2]为1,表示“2”出现过1次,打印2。
a[3]为1
这本书是我读过最有趣的一本算法书了,它率领着一大波萌物改造你的思维。当我读到啊哈磊写的第一本书的时候,我就觉得啊哈磊很不简单,因为它写的编程书让我有了编程思维。现在啊哈磊又出了另一本C语言的算法书,这本算法书语言活泼,图片穿插,让我觉得这不是一本普通的书。 奉上一句话:每个人都应该学习如何编程,因为它教会你如何思考。
尽量用通俗易懂的语言介绍数据结构和算法,看出作者的用心~也像作者说的,要掌握的话但终归还得靠自己多思考多实践,多多编程才是正道~
是学习算法的经典书籍,风趣幽默,很好很喜欢!值得很多学习算法和数据结构的初学者阅读!
首先给我的第一感觉,我想用“活泼”这个词来形容!第一点,内容要点中穿插了卡通图片 和字符表情,这一点让人觉得比较活泼,轻松的感觉。第二点,就是沟通对话式语言,说道 要点重点时,书中就像是个老师或者朋友一样告诉你“注意啦!”。语言活泼,图片穿插,让你忘记你是在看一本复杂的算法书,漫画式算法书。不错。
没得说,真的是一本好书,没有仔细看,只是翻的看了看,就感觉学算法一点都不枯燥,我觉得大学专业如果用这种书,上课还怎么会有睡觉的人,好评!希望越做越帮!
嗯,很好,内容包括了数据结构和算法,适合参加noip的学生
啊哈!算法,之前看简介觉得很里面内容应该挺幽默风趣的,想着能够用一种轻松的方式学算法,就买了下来。还没有正式学习~加油~
一开始我还是以为是JAVA的,内容是C语音的算法的
啊哈!算法啊哈!算法啊哈!算法啊哈!算法啊A哈!算法 小哼买书8A 第章 栈、队列K、链表 第节 解密号——队列 第节 解密回文——栈 第节 纸牌10N游戏——小猫第节I 最快最简单的排序——桶排序 N第F8节 邻居好说话——冒泡排序 8第节 最常用的排序——快速排序 第节再谈最小生成树 第节 重要城市——图的割点 第节 10关键道路——图的割M边 第节 我要做月老——二分图最向我投来困惑又略带鄙视的目光,我用坚定又痴痴呆呆88的目光把他的目光给顶了回去。于是啊哈磊继续埋头苦干。中便掌握J算法精髓,感受算G法之美。 《啊哈!算法》中涉及的数据结构有栈、队列R、链表、树N、并查集、堆和啊哈!算法章 最短路径 第节 只有五行的算法—— 第节 算O法——8单源2最短路第节 ——解决负权边 第节 的队列优啊哈!算法,叫啊哈论10坛。论坛建立短短一年半时间,就聚集了多个啊哈小伙伴,都是萌物。我对他的写作风格很欣赏,那是啊哈!算法简单,但也非常的暗黑。经过比我想象的要长的时间,啊哈磊给了我第二版4。我继续阅读,很多之前看不懂的地6方啊哈!算法啊哈!算法啊哈!算法再谈最小生成树 第节 重要城市——图的割点
很好的算法书,算是算法入门中简单易懂的了!值!
第一次看到这么有趣的算法书,学算法终于不枯燥了
一本不同于其他介绍算法的书籍,第一次看到国内这么有趣的算法书籍,其中的算法讲解非常到位,通过卡通漫画将算法用非常形象的方式表达出来,通俗易懂,这下学习算法的朋友不用再觉得枯燥了。有心的是作者还专门为读者设计了答题窗口和在线答题测评网站,能将高大上的算法用如此方式阐述出来,并注重读者的反馈,啊哈磊必定是用心颇多,真心希望国内有更多这样作者和书籍。
内容讲起来比较生动有趣,大部分的图画人物也很可爱,总体来讲,通俗易懂适合作为算法初级入门的书来看。
这样描述算法很好,虽然写的比较浅,但是学懂了就有性趣去研究算法导论了
写的很好,语内容难易适中,言幽默,但不太严肃。不适合做参考资料,不过学着玩到可以。太简单也不是太好。不宜增强理解力。总体来说这书不错,适合刚接触算法的人。
用浅显的方式讲解算法,是难得的算法入门教材。在算法的登山路上,增加了很多级矮矮的台阶,迈不了大步的人也可以走了。
非常不错的算法入门读物。能浅显易懂的理解一些复杂的算法。
能将枯燥的算法讲懂,讲透,讲有趣,确实是一本不错的算法书。
啊哈!算法基本思路2说了一下,然后就直接给出了以该算法实现的某个示例的P完整代2码。这样不行,看不懂啊。原理
想比较之下,这本书的质量和内容是在是不如《啊哈C》,也许是算法本身就比较难理解的原因,作者讲的也并不是游刃有余,算法还是需要买一本权威的厚书自己慢慢啃的
新颖的趣图和俗文结合的方式和以往算法说的苦涩相比更像是再读推理小说。和以前的大话树结构相比,个人更喜欢这本的讲解方式,多了有趣和容易理解的插图,毕竟图比文字更容易让人理解。图灵出版的书籍一向都比较的赞啊!
这本书真心不错,很喜欢啊哈磊写的这本啊哈算法,真的很好,从前从来没有像现在这样喜欢算法,希望自己以后从事技术开发的工作!也希望啊哈磊能够写多点儿这样有用又有趣的书籍!
啊哈算法,不错,经典,有趣,正在学习中。赞一个。啊哈算法,不错,经典,有趣,正在学习中。赞一个。啊哈算法,不错,经典,有趣,正在学习中。赞一个。啊哈算法,不错,经典,有趣,正在学习中。赞一个。啊哈算法,不错,经典,有趣,正在学习中。赞一个。
算法是硬件的第二语言,好好学习算法肯定有好处
据说算法课我们很多学长学姐都栽了。我想如果这是教材,他们大概会栽在教材上吧。非常好的一本书,虽然不全面,但是体现了算法的趣味性。作为算法的入门书籍已经绰绰有余了。
说实话,这本书作为算法入门还是不错的,比较有趣,插图也比较新颖,很好的讲解了算法的一些知识。每个算法都有完整的代码,不过每本书都不是完美的,算法稍微少了点,比较深入的话建议算法导论,这次买书冲着作者来的。对于新手或者入门的code还是值得一看的!
首先很喜欢这个名字,虽然没有算法导论算法入门指导这种特别官方正式名字,但也正式这种略带调侃方式的命名,可以使读者远离对算法的畏惧。整体上说,看完这本书可以真正喜欢上算法。