编辑推荐

  啊哈!去中科院玩单片机
  呦吼!在微软亚洲研究院写爬虫
  哒哒!写一本开开心心的算法书
  你一定能看懂的算法书!
  作为《啊哈 算法》的策划编辑,我很荣幸。
  《啊哈!算法》是我读过的有趣且是我能看懂的一本算法书。
  我当初是因为啊哈磊写的另外一《啊哈 算法》《啊哈!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-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

精彩书摘

  第1节 最快最简单的排序——桶排序
  在我们生活的这个世界中到处都是被排序过的东东。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。
  首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦。期末考试完了老师要将同学们的分数按照从高到低排序。小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎,考得真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序,排序后是85532。你有没有什么好方法编写一段程序,让计算机随机读入5个数然后将这5个数从大到小输出?请先想一想,至少想15分钟再往下看吧(*^__^*)。
  我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。
  首先我们需要申请一个大小为11的数组inta[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,表示“3”出现过1次,打印3。
  a[4]为0,表示“4”没有出现过,不打印。
  a[5]为2,表示“5”出现过2次,打印55。
  a[6]为0,表示“6”没有出现过,不打印。
  a[7]为0,表示“7”没有出现过,不打印。
  a[8]为1,表示“8”出现过1次,打印8。
  a[9]为0,表示“9”没有出现过,不打印。
  a[10]为0,表示“10”没有出现过,不打印。
  最终屏幕输出“23558”,完整的代码如下。
  #include
  intmain()
  {
  inta[11],i,j,t;
  for(i=0;i

其他推荐