8000 前言 · Issue #3 · Checkson/blog · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
前言 #3
Open
Open
77CA
@Checkson

Description

@Checkson

什么是数据结构和算法?

笼统来说,在日常业务处理中,数据结构是指我们用什么东西(可以是普通的值、数组、链表、对象、集合、树、图等)来存储处理这个业务问题过程中的数据。算法是指我们是怎么去解决一个业务问题(用什么方式去处理)。

用专业术语描述的话,数据结构是指数据之间的结构关系,或者理解成数据元素相互之间存在的一种或多种特定关系的集合。算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

好吧,听起来都可能比较抽象,举个更直观的例子:我现在想去北京旅游,那么我可以自驾、可以坐火车、可以坐高铁、也可以坐飞机等等,这里提到的交通工具本身(火车、飞机等)叫数据结构,而坐什么交通工具(出行方式)的这个描述,叫做算法。所以,我们可以看出,不同的算法(出行方式),性能(速度)是不一样,有快慢之分;不同的数据结构(交通工具),存储形式(站票、软卧等)也是不一样。

你看,这样类比的话,你可以发现生活中充满着类似”算法和数据结构“关系形式的事物存在,这也是为什么提到算法,一般会附带上数据结构;一提到数据结构,算法也随之带上,它们的关系就如"飞机和坐飞机"的关系。其实,很多计算机概念都是源于生活启发,源于数学理论的。

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

这个问题,很多师弟师妹、其他小伙伴、以及很多面试官都曾问过我,我觉得我一直都没答好这个问题,但我也相信,很少人能回答好这个问题。与其说不能回答好这个问题,还不如说,基本上很少人去真正去思考过这个问题,究竟数据结构和算法,在程序设计中,是以怎样具象的东西存在,能让我们实实在在的感受到它存在的威力。

我为什么突出”具象“这个词呢,因为在学校里面,老师在教科书上,或者在线教学视频中的授课,都不能让学生,能有一种”质感“形式去体会到编程中数据结构和算法的存在,大多都停留在枯燥的概念,和生搬硬套的练习。

我身边有这么一位可爱女生,她为了”数据结构和算法“这门课能通过,把老师课上画出来的考试重点的题目中用到的代码都背下来了,最后还考了不错的成绩。当时我听到后,都惊呆了,我并不是佩服她这种”骚操作“,而是思考”为什么有这种功夫去硬背代码,却不去折腾怎么让自己理解好每个算法?“。这个时候,往往我得到的解释大多都是:上课听不懂、没认真听讲、不感兴趣等。甚至,有些已经工作好些年的同学,都会觉得"算法和数据结构"是一个很虚的东西,有没有都不影响日常工作,没必要去专门学习,更别提深入理解了。

我承认,日常业务开发中,很多数据结构和算法,都在第三方库或者项目组中的utils工具库封装得很好了,知道怎么去使用,就可以让开发行云流水了。不过,经过我这些年来的观察,有没有经过”数据结构和算法“熏陶的人,写出来的代码是有很大区别的,甚至天壤之别!有没有?有没有同感的!?这种区别我大致归纳为:

  • 不怎么懂的人: 代码篇幅偏臃肿,逻辑偏紊乱,代码嵌套偏深,代码组织结构偏乱,代码可扩展性偏弱,bug偏多,编程思维和业务处理能力偏弱。
  • 懂的人: 代码特点较精炼、简洁、逻辑清晰、模块高内聚低耦合、bug较偏少、思维偏差较少。

我并没有刻意其抬高懂"数据结构和算法"的人,有多牛逼,多么高人一等,编程思维和能力真的有强弱之分,这个就是要学好”数据结构和算法“的原因之一了。就好比会武功的人,懂不懂内功,往往能决定自身功夫能达到的最高境界。就如,我当时给出的回答很多时候是:”XXX 师弟/师妹,你不学好数据结构和算法,在编程的路上是走不远的“。学习“数据结构和算法”,是能锻炼人的编程能力的,而我们大家都知道,能力需要培养的。

实际上,我还发现,有良好的程序设计基础的人,往往更能够适应多变的业务,甚至更轻松做到技术栈跨域这个过程。因为程序设计中充满着归纳、递推、分而治之、动态规划等思想,而业务中也充满着需要举一反三的情景,这个时候是需要程序员经过了良好的计算机科学教育,才能胜任这种变化已成常态的业务需求。所以,学好“数据结构和算法”更能适应多变的业务需求。

计算机科学家尼克劳斯·沃思认为程序 = 数据结构 + 算法,相信很多人都听过或者已经见过这个公式了,但对于很多初学编程者来说,是一条令人毫无触动的公式,因为他们眼里的程序,还没真正面对复杂的计算和业务。而对于已经工作了的同学,往往会觉得程序 = 需求 + 业务更恰当,这或许就是绝大工作环境影响下导致的认知。

然而,当你业务不再是日常的普通流程、机械重复的工作、模板化的生产,而是要开发一个工具库、或者底层开发、或者数据库内核开发、冷门业务开发等领域,都需要良好的程序设计基础,这条公式,就显得至关重要。一些开拓性、探索性的项目,就更需要良好的程序设计基础。

那么对于像我这样搞Web前端的同学来说,又不是搞什么底层的东西,日常业务又不用接触多复杂的计算,过于关注”数据结构和算法“是不是在装X呢?

不然,因为如果像我这样在实际工作业务(上面提到的冷门业务开发)中,使用了大量的数据结构和算法的同学,必定也深有体会”数据结构和算法”是多么重要的,因为它真的会帮我们解决实实在在的业务问题和技术难题。而且,你可以把“数据结构和算法”当成自己的一种核心竞争力!

其实,在编程中,“数据结构和算法”无处不在,简单的数组就可以当作一种数据结构了,简单的流程控制语句if、for、while就可以当作一种算法了,它们很不起眼,但是,我们很少人会去思考怎么去更好地组织数据结构、运算数据罢了。

怎么学习数据结构和算法?

我这里有一本电子书:《数据结构和算法JavaScript描述》, 或者关注我后续更新的内容,我会归纳精简一些有意思的内容,来减轻读者的压力!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0