算法是大数据分析与处理的关键基础。本书以漫画形式轻松讲解算法的基本知识、关键应用,并以案例贯穿其中,明白易懂。将高大上的算法以明白易懂的方式说透,是本书最大特色,适合与数据相关的从业人员学习、了解。本书以漫画形式轻松讲解算法的基本知识、关键应用,并以案例贯穿其中,明白易懂。
推荐序
记得有一次,朋友读书时看见了“维恩图”一词,不明白它的意思,于是跑来问我。当时,我大致是这么回答的 :“假设有若干个元素,同时还有若干种性质。为了直观地表现出哪些元素具有哪些性质,我们可
以在平面上画出若干个封闭曲线,每个封闭曲线内的区域代表某种性质,然后把各个元素填写在正确的区域里。如果某个元素同时具有两个或多个性质,那就必须把它填写在相应的两个或多个区域的公共部分里。所
以,我们要求这些封闭区域必须恰当地相交,使得每种可能的公共部分都存在。”
看见朋友一副茫然的表情,我只好找来纸和笔,举了一个实际的例子 :“如果这三个圆形区域分别代表‘奇数’、‘质数’、‘平方数’,那么1 就该填到这儿, 2 就该填到这儿, 3 就该填到这儿……”
朋友忽然兴奋地说 :“哦,我好像懂了!维恩图的意思是不是就是,当我想知道眼前的一群人是一群什么样的人时,我就在地上画几个圈,分别表示‘已婚’、‘党员’、‘上班族’,等等,然后每个人属于哪些类就站进哪些圈子里,而且我在地上画的圈需要保证,不管来了什么样的人,他总能找到个地儿站!”
“没错没错,就是这样!”我激动地说道,仿佛恍然大悟的是我一样。
类似的经历我还遇到过一次,只不过我的位置换了一下。你知道吗?
在现实生活中可能出现某些商品,它的价格升高时,人们的购买量也随之增加。这样的商品叫作“吉芬商品”。很有趣吧!很想搞明白这背后的原理吧!第一次听说这样的经济学现象后,我也感到非常好奇,我也
很想知道这背后的原理。我在网上查到了很多与此相关的文章,它们的标题大多类似于“吉芬商品背后的直观解释”。每篇文章里都出现了同一个生词,“无差异曲线”。不管阅读哪篇文章,我都会卡在这个生词处。
什么是无差异曲线?这看起来似乎是经济学中的一个非常基本的东西,因为几乎所有作者在讲解时,都会假设读者已经知道了它的意思。
无奈,我又开始搜寻“无差异曲线”的意思,结果仍然是一头雾水。
大多数地方给出的解释是这样的 :“一条条从左上方延伸到右下方的曲线,说明消费者的偏好不变时,若其中一种商品的消费增加,另一种商品的消费会如何减少……同一条曲线上面的每一点对应的商品组合是不
同的,但是人们从中得到的效用却是相同的。”对于从没接触过经济学的人来说,这样的句子简直如天书一般。
最后,借来一本经济学教材,研究了里面的好几个例子,才让我茅塞顿开 :唉,说得这么麻烦干什么,无差异曲线其实就是购买不同数量的 A 和 B,给人带来的满足感的“等高线”嘛!懂得什么是无差异曲
线之后,再看吉芬商品的讲解文章时,就完全没有障碍了。
学习一门新的学科,往往会遇到很多新的概念。不幸的是,专家们对这些概念太过熟悉,很难意识到这会成为初学者理解的障碍 ;即使意识到了这一点,恐怕一时也很难想到一种真正面向初学者的、简单直白
一语中的的解释;即使想到了这样的解释,综合考虑文体、篇幅等原因,或许也不会真的写下来。种种经历让我深知,填补这个空白是很有必要的。但是,谁来填补这个空白呢?
幸运的是,现在,编程初学者有了像《写给大家看的算法书》这样的书。学习编程变得简单多了。数组,其实就是一排印有号码的储物柜;
堆栈,其实就是桌面上堆积的书……书中充满了这些生动有趣的比方,它们总能让我由衷地感叹 :这比方打得实在是太贴切了。
《写给大家看的算法书》里还会谈到一些更基本的问题。为什么依次执行 X ← Y 和 Y ← X 不能交换两个变量的值?这是因为,往变量里代入值的时候,旧的值是会被覆盖掉的。在专业的程序员看来,这几乎
是废话 ;但谁能想到,或许恰恰就是这句“废话”,解答了某个初学者百思不得其解的困惑。你是否读过很多编程入门读物,但仍然觉得有门槛?那么,这本书值得你尝试。
在信息化和大数据的背景下,人们的思维也或多或少地受到了计算机模型的影响,讨论问题时“树”、“节点”、“字符串”等词常常是张口就来。如果由于学习或者工作的原因,你时不时地会遇到这些陌生的词
汇,相信这本书也会对你有帮助。
数学科普作家 顾森
前 言
计算机自 20 世纪发明以来得到了飞速的发展,在 21 世纪的现代社会,不仅仅是个人计算机,智能手机、电视、电子照相机、游戏机等预装计算机的设备也越来越普及。甚至,地铁的自动刷卡设备、 ATM 自
动柜员机、自动贩卖机等现代社会生活中不可或缺的机器,如果没有了计算机,那么机器的控制、顾客的管理、财务的管理、售卖的管理等各种各样的公司业务全都开展不了。
为了编写在计算机上可以良好运行的程序,我们必须学习“算法”。本书的主旨就是从基础开始详尽地讲解算法。为了让初学者也能充分理解内容,“尽可能通俗易懂”,笔者尽量让大家在轻松学习算法的同时,
也可以尝试理解计算机编程中用到的一些思维方式。另外,为了让中学生也能轻松阅读,本书虚构了埃里根博士、小艾、小莉这三个角色,对算法相关的知识进行讲解。请把自己想象成小艾或者小莉,尝试在埃里根博士的算法讲座中学习吧。
第 1 章 探讨了“什么是算法”这个话题。算法这个词汇可能大家日常生活中接触不多,所以乍听之下会有晦涩艰深的感觉。但简单来说,算法就是“为解决特定问题需要进行的处理步骤”。本章为讲解得更通
俗易懂,拿日常生活中的菜谱做类比。
第 2 章 主要对描述算法的重要元素“数据”进行讲解,包括数据的存、取方法等。另外,本章也对在算法表示问题解决步骤时所必需的“变量”进行讲解,本章详细讲解了它作为数据存储的“盒子”的特征。
第 3 章 讲述了对各种不同形式的数据进行管理的“数据结构”这种管理方式。本章还对其中的特例,如“数组”、“链表”、“树”等数据结构各自的优缺点进行了讲解。
第 4 章 介绍了算法中记述处理步骤的最重要的要素“循环”及使用“循环”进行复用处理的方法。
第 5 章 介绍了最重要的算法之一“排序”。本章从低效但简单的排序处理讲起,由浅入深讲解复杂但高效的排序处理。
第 6 章 介绍了另一类最重要的算法——“搜索”。本章会讲述单纯的搜索、已排序的数据的搜索,以及字符串的搜索等。
第 7 章 介绍一些解决数学问题的算法。本章主要讲解了可以在科学计算领域派上用场的“求解高斯方程”、“求解方程组”及“求定积分的值”等算法。
第 8 章 探讨了“算法和计算机”这个话题。主要解释了一些为实现算法需要了解的计算机相关的基础知识。
通读本书,如果读者能够稍稍消除“算法是什么呀”这种顾虑,并且产生“原来如此,探究起来,计算机程序就是由一些简单的处理组合起来的东西啊”这样的想法的话,那真是笔者的荣幸。另外,如果本书
的内容能成为大家以后熟悉计算机后编写良好、高效的程序的基础的话,
那我真是太开心了。
2012 年 11 月 杉浦贤
“所以可以通过ARRAY[5]”中的元素下标应为4
副标题“数组数据中的最大值”中的“最大值”排版错误,应为“最小值”
“RANK[0]的值加1”表达有些模糊,改为“RANK[0]的值都要加1”。