万书网 > 文学作品 > 漫画算法:小灰的算法之旅 > 第1章 算法概述

第1章 算法概述





1.1 算法和数据结构



1.1.1 小灰和大黄

在大四临近毕业时,计算机专业的同学大都收到了满意的offer,可是小灰却还在着急上火。虽然他这几天面试了很多家IT公司,可每次都被面试官“虐”得很惨很惨。

就在心灰意冷之际,小灰忽然想到,他们系里有一位学霸名叫大黄,大黄不但技术很强,而且很乐意帮助同学。于是,小灰赶紧去找大黄,希望能够得到一些指点。



1.1.2 什么是算法

算法,对应的英文单词是algorithm  ,这是一个很古老的概念,最早来自数学领域。

有一个关于算法的小故事,估计大家都有耳闻。

在很久很久以前,曾经有一个顽皮又聪明的“熊孩子”,天天在课堂上调皮捣蛋。

终于有一天,老师忍无可忍,对“熊孩子”说:

臭小子,你又调皮啊!今天罚你算加法,算出1+2+3+4+5+6+7……一直加到10000的结果,算不完不许回家!

嘿嘿,我算就是了。

老师以为,“熊孩子”会按部就班地一步一步计算,就像下面这样。

1  +  2  =  3

3  +  3  =  6

6  +  4  =  10

10  +  5  =  15

……

这还不得算到明天天亮?够这小子受的!老师心里幸灾乐祸地想着。

谁知仅仅几分钟后……

老师,我算完了!结果是50  005  000,对不对?

这、这、这……你小子怎么算得这么快?我读书多,你骗不了我的!

看着老师惊讶的表情,“熊孩子”微微一笑,讲出了他的计算方法。

首先把从1到10  000这10  000个数字两两分组相加,如下。

1  +  10  000  =  10  001

2  +  9999  =  10  001

3  +  9998  =  10  001

4  +  9997  =  10  001

……

一共有多少组这样结果相同的和呢?有10  000÷2即5000组。

所以1到10  000相加的总和可以这样来计算:

(1+10  000)×10  000  ÷  2  =  50  005  000

这个“熊孩子”就是后来著名的犹太数学家约翰·卡尔·弗里德里希·高斯  ,而他所采用的这种等差数列求和的方法,被称为高斯算法  。(上文的故事情节与史实略有出入。)

这是数学领域中算法的一个简单示例。在数学领域里,算法是用于解决某一类问题的公式和思想。

而本书所涉及的算法,是计算机科学领域的算法,它的本质是一系列程序指令,用于解决特定的运算和逻辑问题。

从宏观上来看,数学领域的算法和计算机领域的算法有很多相通之处。

算法有简单的,也有复杂的。

简单的算法,诸如给出一组整数,找出其中最大的数。

复杂的算法,诸如在多种物品里选择装入背包的物品,使背包里的物品总价值最大,或找出从一个城市到另一个城市的最短路线。

算法有高效的,也有拙劣的。

刚才所讲的从1加到10000的故事中,高斯所用的算法显然是更加高效的算法,它利用等差数列的规律,四两拨千斤,省时省力地求出了最终结果。

而老师心中所想的算法,按部就班地一个数一个数进行累加,则是一种低效、笨拙的算法。虽然这种算法也能得到最终结果,但是其计算过程要低效得多。

在计算机领域,我们同样会遇到各种高效和拙劣的算法。衡量算法好坏的重要标准有两个。

时间复杂度

空间复杂度

具体的概念会在本章进行详细讲解。

算法的应用领域多种多样。

算法可以应用在很多不同的领域中,其应用场景更是多种多样,例如下面这些。

1.  运算

有人或许会觉得,不就是数学运算吗?这还不简单?

其实还真不简单。

例如求出两个数的最大公约数,要做到效率的极致,的确需要动一番脑筋。

再如计算两个超大整数的和,按照正常方式来计算肯定会导致变量溢出。这又该如何求解呢?

2.  查找

当你使用谷歌、百度搜索某一个关键词,或在数据库中执行某一条SQL语句时,你有没有思考过数据和信息是如何被查出来的呢?

3.  排序

排序算法是实现诸多复杂程序的基石。例如,当浏览电商网站时,我们期望商品可以按价格从低到高进行排序;当浏览学生管理网站时,我们期望学生的资料可以按照学号的大小进行排序。

排序算法有很多种,它们的性能和优缺点各不相同,这里面的学问可大着呢。

4.  最优决策

有些算法可以帮助我们找到最优的决策。

例如在游戏中,可以让AI角色找到迷宫的最佳路线,这涉及A星寻路算法。

再如对于一个容量有限的背包来说,如何决策才可以使放入的物品总价值最高,这涉及动态规划算法。

5.  面试(如果这条也算的话)

凡是已走上工作岗位的程序员,在面试过程中多多少少都经历过算法问题的考查。

为什么面试官那么喜欢考查算法呢?

考查算法问题,一方面可以检验程序员对计算机底层知识的了解,另一方面也可以衡量一下程序员的逻辑思维能力。



1.1.3 什么是数据结构

算法的概念我大致明白了,那数据结构又是什么呢?

数据结构是算法的基石。如果把算法比喻成美丽灵动的舞者,那么数据结构就是舞者脚下广阔而坚实的舞台。

数据结构,对应的英文单词是data  structure  ,是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据。

数据结构都有哪些组成方式呢?

1.  线性结构

线性结构是最简单的数据结构,包括数组、链表,以及由它们衍生出来的栈、队列、哈希表。

2.  树

树是相对复杂的数据结构,其中比较有代表性的是二叉树,由它又衍生出了二叉堆之类的数据结构。

3.  图

图是更为复杂的数据结构,因为在图中会呈现出多对多的关联关系。

4.  其他数据结构

除上述所列的几种基本数据结构以外,还有一些其他的千奇百怪的数据结构。它们由基本数据结构变形而来,用于解决某些特定问题,如跳表、哈希链表、位图等。

有了数据结构这个舞台,算法才可以尽情舞蹈。在解决问题时,不同的算法会选用不同的数据结构。例如排序算法中的堆排序,利用的就是二叉堆这样一种数据结构;再如缓存淘汰算法LRU(Least  Recently  Used,最近最少使用),利用的就是特殊数据结构哈希链表。

关于算法在不同数据结构上的操作过程,在后续的章节中我们会一一进行学习。

想不到算法和数据结构包括这么多丰富多彩的内容,大黄,我以后要好好跟你混!

嘿嘿,我所掌握的也只是广阔的算法海洋中的一个小水洼,让我们一步一步来体验算法的无穷魅力吧!