刚学习数据结构与算法时,就被告知 “程序=算法+数据结构”,而这段话来自于对点计算机科学家Niklaus Wirth在1976年出版的一本书的书名,后来这句话也成为计算机工作者之间流传的一句名言,小编也用惨痛的经历告诉大家这也是一个很重要的知识点。
那么到底什么是数据结构和算法,数据结构算法又有什么用呢?
首先来说说什么是数据结构,直接上图
从图中我们可以很直观的看出数据结构涵盖的内容。
算法的介绍就相对抽象了,百度百科给出的解释是
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或者多个操作。
但是我们从他的特性来理解就会简单多了。
算法主要有五个特性
· 有穷性:指令序列是有限的
· 确定性:每条语句的含义明确,无二义性
· 可行性:每条语句都应在有限的时间内完成
· 输入:零个或者多个输入
· 输出:一个或者多个输出
说到数据结构算法的用处,当你用着java容器类很爽的时候,你有没有想过,怎么ArrayList像一个无限扩充的数组,也好像一个链表。好用吗?当然好用这就是数据结构的用处,只不过你在不知不觉中使用了。
用于现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗。
而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。
说了这么多
算法和程序到底有什么区别呢?
程序是软件开发人员根据用户需求开发的、用程序设计语言描述的适合计算机执行的指令(语句)序列。除此,程序还包括四个要素,数据结构、算法、程序设计方法、编程语言。
程序与算法又不同。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的有穷性,比如操作系统也是一种程序,如果你愿意,你的电脑可以一直开着,保持操作系统的运行。
程序、算法、软件之间又存在着一定的关系:
程序:算法的计算机实现。用某种编程语言实现。
算法:表示问题的解。
软件:程序+文档
算了,还是用图片来表达他们相互之间的关系更加容易理解
干货太多就显得太死板,下面来说说和技术无关的。
大学里那本严蔚敏的数据结构,大家都不陌生吧。 虽然不厚,但是相信仍然会在多年后支配大家的恐惧。
这本书中的内容也算丰富,但是对于复杂问题的讲解就很少了。
后来在知乎看到涛吴的回答,觉得很有意思,这里引用一下他的回答:
如果说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而且未必就比懂得的人慢。
写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。如果你对这两件事都不感兴趣也就罢了,数据结构懂得用就好。但若你此生在编程领域还有点更高的追求,数据结构是绕不开的课题。
Java 替你做了太多事情,那么多动不动还支持范型的容器类,加上垃圾收集,会让你觉得编程很容易。但你有没有想过,那些容器类是怎么来的,以及它存在的意义是什么?最粗浅的,比如 ArrayList 这个类,你想过它的存在是多么大的福利吗——一个可以随机访问、自动增加容量的数组,这种东西 C 是没有的,要自己实现。
但是,具体怎么实现呢?如果你对这种问题感兴趣,那数据结构是一定要看的。甚至,面向对象编程范式本身,就是个数据结构问题:怎么才能把数据和操作数据的方法封装到一起,来造出 class / prototype 这种东西?
此外,很重要的一点是,数据结构也是通向各种实用算法的基石,所以学习数据结构都是提升内力的事情。
反正我有醍醐灌顶的感觉,能把复杂的东西这么通俗的讲解出来,大牛的视角果然与常人不同。
其实当你生活中的编程问题需要解决的时候,你会发现到处都是数据结构的使用,像基金买入买出不是队列吗,先进先出;像简单的一个班级学生的数据保存,用个数组不就可以解决了吗;再复杂的游戏路线问题,这不是图的问题吗;Java里面有Tree这字的,其实不也是用到树的原理吗?
种种下来,你会发现,原来现实问题和语言里面的封装,都是和这些有联系的,每当你学会一种,就会恍然大悟,这不就是当年西湖河畔的夏雨荷,就是这种感觉。
好了,关于数据结构今天就聊这么多。