啊哈 算法 epub pdf mobi txt 电子书 下载 2024
发表于2024-12-29
啊哈 算法 epub pdf mobi txt 电子书 下载 2024
啊哈!去中科院玩单片机
呦吼!在微软亚洲研究院写爬虫
哒哒!写一本开开心心的算法书
你一定能看懂的算法书!
作为本书的策划编辑,我很荣幸。
《啊哈!算法》是我读过的有趣且是我能看懂的一本算法书。
我当初是因为啊哈磊写的另外一本书《啊哈!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
第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,表示“3”出现过1次,打印3。
a[4]为0,表示“4”没有出现过,不打印。
a[5]为2,表示“5”出现过2次,打印5 5。
a[6]为0,表示“6”没有出现过,不打印。
a[7]为0,表示“7”没有出现过,不打印。
a[8]为1,表示“8”出现过1次,打印8。
a[9]为0,表示“9”没有出现过,不打印。
a[10]为0,表示“10”没有出现过,不打印。
最终屏幕输出“2 3 5 5 8”,完整的代码如下。
#include
int main()
{
int a[11],i,j,t;
for(i=0;i<=10;i++)
a[i]=0; //初始化为0
for(i=1;i<=5;i++) //循环读入5个数
{
scanf("%d",&t;); //把每一个数读到变量t中
a[t]++; //进行计数
}
for(i=0;i<=10;i++) //依次判断a[0]~a[10]
for(j=1;j<=a[i];j++) //出现了几次就打印几次
printf("%d ",i);
getchar();getchar();
//这里的getchar();用来暂停程序,以便查看程序输出的内容
//也可以用system("pause");等来代替
return 0;
}
输入数据为:
5 3 5 2 8
仔细观察的同学会发现,刚才实现的是从小到大排序。但是我们要求是从大到小排序,这该怎么办呢?还是先自己想一想再往下看哦。
其实很简单。只需要将for(i=0;i<=10;i++)改为for(i=10;i>=0;i--)就OK啦,快去试一试吧。
这种排序方法我们暂且叫它“桶排序”。因为其实真正的桶排序要比这个复杂一些,以后再详细讨论,目前此算法已经能够满足我们的需求了。
这个算法就好比有11个桶,编号从0~10。每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就OK了。例如2号桶中有1个小旗子,表示2出现了一次;3号桶中有1个小旗子,表示3出现了一次;5号桶中有2个小旗子,表示5出现了两次;8号桶中有1个小旗子,表示8出现了一次。
现在你可以尝试一下输入n个0~1000之间的整数,将它们从大到小排序。提醒一下,如果需要对数据范围在0~1000的整数进行排序,我们需要1001个桶,来表示0~1000之间每一个数出现的次数,这一点一定要注意。另外,此处的每一个桶的作用其实就是“标记”每个数出现的次数,因此我喜欢将之前的数组a换个更贴切的名字book(book这个单词有记录、标记的意思),代码实现如下。
#include
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
book[i]=0;
scanf("%d",&n;);//输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序
{
scanf("%d",&t;); //把每一个数读到变量t中
book[t]++; //进行计数,对编号为t的桶放一个小旗子
}
for(i=1000;i>=0;i--) //依次判断编号1000~0的桶
for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次
printf("%d ",i);
getchar();getchar();
return 0;
}
可以输入以下数据进行验证。
10
8 100 50 22 15 6 1 1000 999 0
运行结果是:
1000 999 100 50 22 15 8 6 1 0
最后来说下时间复杂度的问题。代码中第6行的循环一共循环了m次(m为桶的个数),第9行的代码循环了n次(n为待排序数的个数),第14行和第15行一共循环了m+n次。所以整个排序算法一共执行了m+n+m+n次。我们用大写字母O来表示时间复杂度,因此该算法的时间复杂度是O(m+n+m+n)即O(2*(m+n))。我们在说时间复杂度的时候可以忽略较小的常数,最终桶排序的时间复杂度为O(m+n)。还有一点,在表示时间复杂度的时候,n和m通常用大写字母即O(M+N)。
这是一个非常快的排序算法。桶排序从1956年就开始被使用,该算法的基本思想是由E.J. Issac和R.C. Singleton提出来的。之前我说过,其实这并不是真正的桶排序算法,真正的桶排序算法要比这个更加复杂。但是考虑到此处是算法讲解的第一篇,我想还是越简单易懂越好,真正的桶排序留在以后再聊吧。需要说明一点的是:我们目前学习的简化版桶排序算法,其本质上还不能算是一个真正意义上的排序算法。为什么呢?例如遇到下面这个例子就没辙了。
现在分别有5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分。请按照分数从高到低,输出他们的名字。即应该输出gaoshou、huhu、xixi、haha、hengheng。发现问题了没有?如果使用我们刚才简化版的桶排序算法仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。也就是说,我们现在并不知道排序后的分数原本对应着哪一个人!这该怎么办呢?不要着急,请看下节——冒泡排序。
……
我想写一本通俗易懂的算法书很久了,因为对于多数人而言,“算法”给他的第一印象就是很难懂,其实我也是这样。还记得我第一次学习图论的“割点割边”算法时,看过不下于四五本书,其中不乏一些算法经典书籍,还百度了一堆材料,才勉强将其看懂并实现成代码。其实这个算法并不难,核心代码不超过20行,但是很多算法书都是草草叙述,不同的书籍给出的参考代码也是五花八门,有的甚至都不稀罕给你代码,这大大增加了学习的难度。我是花了整整一个晚上才搞定的,当然这其中不排除智商因素。第二印象就是算法是枯燥无趣的,并且好像没什么作用。其实在我们的日常生活之中到处都可见到算法的影子,只不过它通常隐匿在事物的背后,不太容易被发现。但是它每天都在默默地为我们服务着。在本书中我将带你一步步揭开算法的奥秘,带它走近你的身边。
由于算法的内容确实是太多了,要想全部写清楚恐怕几本书都不够,本书将介绍一些最常用的算法。此外算法的实现通常需要依附一些数据结构,因此在必要的时候对于需要用到的数据结构我也会进行讲解。本书中涉及的数据结构有栈、队列、树、并查集、堆和图等;算法有各种排序、枚举、深度和广度优先搜索、图上的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、割点与割边算法、二分图的最大匹配算法等。
尽管我不敢保证我写的算法你一定可以看懂(但凭着一股强大的自信,我认为初中以上文化程度的应该没问题^_^),但我会以一个故事或者一个你在生活中可能遇到的问题开始对一个算法进行讲解,并尽量用通俗易懂的语言配合有趣的插图让你在阅读本书的时候更像是在品读一篇篇轻松的短篇小说或是在玩一把趣味解谜游戏,在轻松愉悦中掌握算法精髓,感受算法之美。
致谢
本书能得以面世,首先要感谢图灵的陈冰先生。感谢你主动联系我,给予我信心去完成本书的全部,并且提出了很多宝贵的建议。更加令我吃惊的是你竟然能读懂本书的全部算法(包括每一行代码),还发现了很多隐藏得很深的错误,真是一位非常棒的图书出版人。
在书稿创作的过程中,有幸和很多优秀的学生共同学习和探讨,是他们为本书的创作提供了灵感,感谢他们的倾听、交流和建议。他们是武汉二中的吕凯风同学、武汉外国语学校的李嘉浩、熊子健、陈雨禾、郭明达和李丁等同学。
本书之所以变得这么有趣,还必须要感谢我的美女插画师郑佳茜,你灵感涌现的插图功不可没。
感谢我的好友张知严,无私地帮助我搭建了“添柴”编程在线学习系统(tianchai。org),为本书读者提供了更好的学习交流平台。
感谢我的学生胡梦清,感谢你排除万难来参加你人生中的最后一场NOIP竞赛。是你用行动、青春路上追求梦想的精神,告诉我们18岁就应该可爱、执着、不畏惧,敢于朝着梦想前行。
特别感谢我的未婚妻Snowin,是你放弃了近一年来所有的周末和节假日,陪我在书桌旁、咖啡厅里、旅途中……共同完成了本书的每一个字、每一幅图、每一段代码。
最后要感谢我的父母,你们把我拉扯大太不容易了,我爱你们!
啊哈磊
2014年5月6日
啊哈 算法 epub pdf mobi txt 电子书 下载 2024
啊哈 算法 下载 epub mobi pdf txt 电子书 2024啊哈 算法 mobi pdf epub txt 电子书 下载 2024
啊哈 算法 epub pdf mobi txt 电子书 下载一直很期待买的书,很喜欢,物流很快呦!
评分好书,相见恨晚
评分一直想买这本书,等了好久
评分还没看,囤书慢慢学习
评分实例丰富,通俗易懂!完美图解,简单有趣。快递迅速!资源丰富,技术支持完备!
评分很不错的东西值得推荐哦!
评分赶上搞活动时候买的,还可以。
评分专业书籍,正版,实用,值得一看。
评分经典图书,希望能坚持学完,并且学有所用,成功转行。
啊哈 算法 epub pdf mobi txt 电子书 下载 2024