描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787115354594丛书名: 图灵原创
啊哈!去中科院玩单片机
呦吼!在微软亚洲研究院写爬虫
哒哒!写一本开开心心的算法书
你一定能看懂的算法书!
作为本书的策划编辑,我很荣幸。
《啊哈!算法》是我读过的有趣且是我能轻松看懂的一本算法书。
我起初是因为啊哈磊写的另外一本书《啊哈!C》而认识啊哈磊的。啊哈磊还有个网站,也叫啊哈磊,这个啊哈磊网站中有个论坛,叫啊哈论坛。论坛建立短短一年半时间,就聚集了15000多个啊哈小伙伴,都是萌物。我对他的写作风格很欣赏,那是一种因热爱和探究而产生的纯粹的快乐,因此,当啊哈磊率领着他的一大波萌物开开心心地攻城略地,浩浩荡荡地兵临城下,跟我说他想写一本通俗易懂的算法书,不知是否能出版时,我的回答是:“必须出版!”
这本书出版意向的达成就是这么简单。
但创作的过程一点不轻松。因为任何一本拿得出手的书的创作都是作者大量时间和精力付出的结果。是毅力的累积。
几个月之后,我拿到了这本书的初稿。我高高兴兴地开始读。这部分写得通俗易懂,我看得津津有味。但读了一些之后,我发现我高兴不起来了,我遇到了困难,有些篇章写得太简略了,只是把算法的基本思路说了一下,然后就直接给出了以该算法实现的某个示例的完整代码。
这样不行,看不懂啊。原理很简单,但实现起来时,看代码就感觉对应不起来了。或许比我聪明的人能看懂,但我希望像我这种在算法方面毫无造诣的普通选手读起来也不吃力,于是我让啊哈磊完善它。我是这么交代的——你得写得让我能看懂才行。这要求非常的简单,但也非常的暗黑。
经过比我想象的要长的时间,啊哈磊给了我第二版。
我继续阅读,很多之前看不懂的地方现在能看懂了,或者至少我认为我看懂了(请允许我使用这种让人生气的措辞),但还有少部分欠点劲儿。啊哈磊向我投来困惑又略带鄙视的目光,我用坚定又痴痴呆呆的目光把他的目光给顶了回去。
于是啊哈磊继续埋头苦干。
终于,我完全可以看懂的版本诞生了。
对于一本技术书,一个编辑可能犯下的“错误”就是试图去完全读懂它。
我还要特别强调一点,这本书不仅写得通俗易懂,而且还在一个非常重要的方方面超越了其他技术书,那就是这本书中还配了可爱的漫画,萌萌的画风,生动的场景,与文字浑然一体。
《啊哈!算法》中涉及的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及的算法有排序、枚举、深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种*短路径算法、两种*小生成树算法、割点与割边算法、二分图的*匹配算法等。
目录
第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-Warshall 148
第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
评论
还没有评论。