本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11395381
Jack:为什么我们要学习数据结构和算法呢?
我:我建议你看一下《计算机程序设计艺术》,在这里你能找到你想要的答案。
Jack:为什么不是《算法导论》呢?
我:《算法导论》会告诉你基础的算法、数据结构是什么,但是不会告诉你为什么计算机要使用数据结构以及数据结构能在计算机里发挥什么样的作用。
Jack:这有区别吗?
我:你研究一个东西需要知道这个东西能解决什么样的问题以及没有这个东西会出现什么样的问题。简单的说,需要把出发点或者说是方向找好。
Jack:如果没有找好方向会怎么样?
我:会有两个问题:
1、方向错了,你跑得越快离目标就越远。
2、即便你方向蒙对了,但是不明白所以然,充其量,只是个“武夫”。
Jack:从你的理解来看,数据结构要解决什么样的问题呢?
我:从起源讲起吧。在上世纪50年代的时候计算机内存还很小。那个时候只要能把stack的内存使用好就行了。在那个年代,计算机程序就是单纯的逻辑代码。程序员一直在抱怨内存太小,计算机能做的事情非常有限。10年之后,内存容量扩大了很多,这个时候程序员迷茫了——他们不知道怎么样才能把这么大的内存使用好!
Jack:这好比一个穷人整天幻想能有1个亿。但是,当有一天,他真的中了1亿的彩票后,他会发现他自己其实根本不具备管理好这1个亿的能力——糟蹋了!
我:是的。早期的程序员惯性思维是,内存就是要以数组类型的固定大小使用,突然之间内存大了那么多,反而不知道怎么用了。一个或者多个数组有什么样的描述能力呢?答案是几乎没什么描述能力——相对于今天的技术。
Jack:那后来是怎么解决这个“大内存”问题的呢?
我:这个时候有一些计算机业内的先驱(具备数学家背景),他们把数学上的一些理论嫁接到计算机上来。比如说,常见的线性结构、树形结构等等。
Jack:也就是说,其实计算机技术就是数学的技术?
我:这个说法是不合理的。计算机技术有一部分数学的移植成分。就是说,如果计算机理论要有一个新的突破,需要数学做支撑,但是,并是说数学的理论都能适用到计算机。
Jack:那数据结构解决了什么样的问题呢?
我:在复杂的数据结构出现之前,stack里的数据大都是“逻辑”性的数据,代码不具备复杂信息的描述能力。复杂的数据结构好比是heap里的骨架,它能够串接起复杂的信息,而使起具备某种规律,使这些数据具备可控性。一句话,如果没有复杂的数据结构,计算机其实就是个计算器!
Jack:那你理解的程序设计的艺术是什么呢?
我:所有的程序,无论是操作系统内核,还是高性能server,它具有精妙的结构体设计,精妙的数据结构来管理heap内存(恰如其分地描述你的需求,同时查找、排序的时间复杂度、空间复杂度完美结合),它就是一个艺术品。
Jack:用一句话概括呢?
我:你在一大块内存里画出一幅漂亮的数据结构图形,这就是一个艺术品!