说起来,数据结构已经有很久的历史了。早在1968年,美国的一些大学就开始开设数据结构课程,但是课程内容、范围都没有明确界定。随着计算机软件的不断发展,数据结构的课程内容也在不断扩充,到现在已经成为了计算机相关专业的基础核心课程。
很多人学习了数据结构课程或者了解课程内容后,心里通常会出现一个疑问:现在高级语言越来越强大,能够使用到的开发库越来越多,这时再去学习基础的表、树、图、哈希表、排序等等还有意义吗?这些结构和算法都有现成的实现,我只要知道如何使用就可以了,还花时间学习造轮子,不是浪费时间吗?在实际业务系统中,好像根本用不到表、树、图这些内容,学了还有啥用?
这些问题的确困扰了很多人,特别是在这个流行吃快餐的年代,大量的培训机构通过流水线的模式经过简单培训将学员送进职场,似乎知道怎么做、怎么用就可以了,其他的都不重要,慢慢体会就行,用熟了自然就会了。但实际上,在这里我们要搞清楚一个问题,数据结构中貌似用不到的表、树、图结构的内容设置,到底是让我们学什么?仅仅是搞懂这些结构吗?这才是问题的关键。
我的体会是,数据结构真正想告诉我们的是,如何对现实问题进行建模,并且采用合适的算法高效解决问题。这是一种计算思维,与语言无关,与工具无关,它是我们从现实世界走向计算机世界的桥梁。
目前,计算机的处理能力已经强大到令人难以置信的地步,但换个角度看,计算机又是愚蠢的,它只能执行一条条二进制指令,它甚至不知道自己在做什么。那么,在面临一个实际问题时,我们应该怎么做?第一步就是建模。从《数据结构》的角度看,我们首先要采用一个适合的模型来表示这个问题空间,然后基于这个模型设计高效的算法,运用算法解决我们面临的问题。在完成这个工作后,我们就可以使用程序语言描述模型与算法,然后进一步转化为二进制指令,从而运用计算机强大的处理能力来解决问题。
就拿网络爬虫的例子来说。如果我们要设计一个爬虫,获取互联网特定网址的所有数据,我们该怎么做?首先,我们可以使用有向图对问题空间进行建模,将各URL的网页看作为一个个独立的节点,把网页中的超链接看作有向边连接不同的URL。有了有向图这个模型,那么爬虫的主要任务就变成了获取特定区域内所有节点数据(仅获取一次),那么这个过程就变成了有向图的遍历运算。完成了这一步,我们就实现了爬虫最主要的分析工作,后续就需要使用特定的语言和工具实现爬虫了。
从上面的分析可以看出,《数据结构》本身实际上是语言无关的,它考虑的是问题本身,它解决的也是问题求解中最关键的步骤,而我们学习数据结构,重点要学习的就是这种计算思维,而不仅仅是表、树、图或具体的算法。所以,无论现在的高级语言如何发展,无论有多么强大的开发包,数据结构、算法仍然是值得学习的,否则我们只能在划定的圈子里跳舞,遇到新的复杂问题就会变得束手无策。
但是也要看到,编程语言、开发工具的发展对问题的求解也是有利的。正如很多人看到的,简单的数据结构和算法现在都有很强大的实现了(如C++的STL、Python Numpy等),我们不需要重复造轮子,它们能使我们把精力放到更高层次的问题上,让我们能够集中精力为更抽象的问题建立大模型、设计宏观算法,例如分布式计算架构的设计等,这仍然需要《数据结构》的支撑。
因此,学习《数据结构》过时了吗?我不这么认为。