#1 为什么要学习数据结构与算法

519 阅读7分钟
原文链接: mp.weixin.qq.com

最近网络上有大量的程序员应该学习数据结构和算法的文章。还记得在大学时代的时候,系统的学习过数据结构、算法相关的课程,而后几乎没有系统学习过了。 工作后从一开始的各种业务逻辑的开发,慢慢深入了解到系统底层,了解了代码的执行效率以及对硬件设备资源的消耗基本上都是由数据结构和算法决定的,才开始慢慢关心起来良好的数据结构设计和良好的算法设计,才能够在数据量越来越多的时候,所设计的软件才能良好地执行等。

那么对于程序员来说,到底为什么要学习数据结构和算法呢?首先要了解的是什么是数据结构

什么是数据结构?

具体的定义这里摘录了维基百科的定义,具体如下:

在计算机科学中,数据结构(英语:data structure)是计算机中存储、组织数据的方式。

数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

大多数数据结构都由数列、记录、可辨识联合、引用等基本类型构成。举例而言,可为空的引用(nullable reference)是引用与可辨识联合的结合体,而最简单的链式结构链表则是由记录与可空引用构成。

数据结构可透过编程语言所提供的数据类型、引用及其他操作加以实现。一个设计良好的数据结构,应该在尽可能使用较少的时间与空间资源的前提下,支持各种程序运行。

不同种类的数据结构适合不同种类的应用,部分数据结构甚至是为了解决特定问题而设计出来的。例如B树即为加快树状结构访问速度而设计的数据结构,常被应用在数据库和文件系统上。

正确的数据结构选择可以提高算法的效率(请参考算法效率)。在计算机程序设计的过程中,选择适当的数据结构是一项重要工作。许多大型系统的编写经验显示,程序设计的困难程度与最终成果的质量与表现,取决于是否选择了最适合的数据结构。

系统架构的关键因素是数据结构而非算法的见解,导致了多种形式化的设计方法与编程语言的出现。绝大多数的语言都带有某种程度上的模块化思想,透过将数据结构的具体实现封装隐藏于用户界面之后的方法,来让不同的应用程序能够安全地重用这些数据结构。C++、Java、Python等面向对象的编程语言可使用类 (计算机科学)来达到这个目的。

摘录自维基百科: 数据结构[1]

其中有一段个人觉得很有启发,“不同种类的数据结构适合不同种类的应用,部分数据结构甚至是为了解决特定问题而设计出来的。 个人理解是数据结构不仅仅百年不变的,不同的问题在不同的条件下,可能需要不同的数据结构设计,对于软件开发者而言,数据结构思维要时刻记载心间,根据特定的问题、所处的环境,选择或者设计那种平衡了性能和效率的数据结构。

什么是算法?

同样摘录自维基百科,具体如下:

算法(algorithm),在数学(算学)和计算机科学之中,为任何一系列定义的具体计算步骤,常用于计算、数据处理和自动推理。作为一个有效方法,算法被用于计算函数,它包含了一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。

算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。包括随机化算法在内的一些算法,都包含了一些随机输入。

摘录自维基百科: 算法[2]

简言之,就是算法是具体的计算步骤,算法的输入和输出都需要有效。在不同的问题上,所采用的算法也不尽相同,可以说算法也是针对特定的问题和特定的环境下,进行优化设计的一种计算步骤。

由算法衍生出来一系列和算法相关的内容,例如设计模式、时间复杂度、空间复杂度等,为算法的设计和实现提供理论支撑,衡量算法的性能和效率等。具体在后续的内容中将会深入学习。

为什么要学习数据结构和算法

计算数据结构和算法都是为了特定的问题在特定的环境下,设计软件开发的系统结构、代码实现方式等,那么程序员就应该熟谙其中的知识点,掌握基本的数据结构设计和算法设计,以最优化的思维编写程序代码,完成对特定功能的最优化实现,保证软件的高质量完成和执行。具体程序员为什么要学习数据结构和算法,大概有如下三点理由:

1. 面试

毫不客气地讲,良好的数据结构和算法知识储备,是程序员或者软件开发工程师找工作的敲门砖。在工程师面试的中,几乎都会涉及到算法和数据结构的测试,具有扎实的数据结构和算法基础,越来越成为面试中是否可以继续的红线。

2. 工作

在工作中面临巨大的数据量时,良好数据结构的设计,能够应对更加从容;使用正确的算法能够让软件的性能和效率更好。移动端应用程序将会更灵活并且耗电量低。服务端应用程序将会在少量的能耗下处理多并发请求等。

3. 自我提升

技术的革新是日新月异的,作为技术从业者,我们可能要不断地进行学习,以了解技术的发展,并应对业务的发展。例如在Swift语言中,Swift标准库有一个通用的集合类型的系列,他们不需要定义所有特定的情况,通用类型即可。在不断学习之后,你才能了解到语言本身所涵盖的特性等,为了更加高效和完善的软件提供知识支援等。

总结

或许每个人的学习方式和目的不尽相同,但是上述三个理由,总有一个给与你学习的充分理由的,不论是为了即将到来的面试、还是正在进行中的工作任务,抑或为了不让自己的技术落伍等,作为程序员来说,都应该重视数据结构和算法,夯实自己的基础知识,并在其上映射到你所擅长或者感兴趣的编程语言上,了解语言的特性并编写设计出良好的数据结构和算法,为自己储备粮草,随时应对未知的未来!

引用链接

[1] 数据结构: https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84 [2] 算法: https://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95