导语
大家好, 相信来自科班的朋友们都上过 数据结构 这门课, 即使不是科班出身, 这门课的重要性我相信在大家的心里不言而喻。不管对于考研还是找工作这门课都是非常重要的。
好了,现在在你的心里已经有了一点“这门课很重要”的概念,你可能还是没那么坚定,这门课到底为什么那么重要。
绪论
计算机的功能,说到底就是处理数据,与其说我们每天在电子世界里遨游,不如说我们每天泡在二进制世界里,计算机面对的是数不清的1和0。归根结底——这些1和0都是数据。
的确,数据就是计算机中最重要的,某种意义上来说也可以说是唯一的事物。
我们每天打交道的软件,我们都知道他们本质上都是一些程序和文档的组合。
文档暂且不说,那是属于 软件工程 这门课的内容了,我们就来说说程序。
程序员们每天进行的编程工作,实际上是在通过一些计算机能读懂的语言对他们发号施令,此时让我们闭上眼睛,穿越到计算机的内部,想象一下,计算机中的数据们正听着我们的号令,有序地排成一些队列,准备与他们的“敌人”——即将处理的那些任务一战。你要以怎样的方式排列他们?是把它们每个人排成一列,还是把它们排成“八卦阵”?这些数据排列的方式,就是数据结构了。
要面对敌人,光把士兵排好队也只能等死,士兵们还要进行攻击、防御等活动,才能打败敌人,那么,指挥士兵们如何进攻、如何防御的,就是算法了,在大多数开发过程中,遇到的敌人很菜,你不需要动很多脑筋,想特别复杂的算法,你的数据士兵就能获胜,比如我在豆瓣的一些算法书籍的书评中就看到有人说:“在我有限的编程生涯中几乎没碰到过算法的问题”。
但是,我们学习数据结构和算法的意义,不在于你在开发过程中到底用不用到这些,他们更接近于一种理论而不是实在的技术,但是通过学习他们,你可以更清晰地了解到你写出的程序、你的数据士兵们到底都是出于一种什么样的情况、甚至与他们产生感情。面对敌人,首先要知己,否则在你的数据士兵们眼中,你会是一个非常不亲民的指挥官。
在以后的过程中我会经常使用“指挥官与士兵”的比喻。
问题规模与复杂度度量
问题规模
我前面提到我们面对的“敌人”也就是我们要处理的问题,他们的体量是不同的,敌人有可能数量大,但是单个作战能力差,也可能数量小单兵作战能力强,但是这样把敌人进行归类,对于要处理很多问题的士兵