首页 > 编程知识 正文

数据结构与算法的区别,算法与程序的区别与联系

时间:2023-05-06 01:15:20 阅读:163913 作者:2834

是什么? 什么是程序等于数据结构算法?

这个公式是大师Niklaus Wirth在1976年提出的,40多年后这个公式仍然成立吗?

对于做Java开发的朋友,可能会更赞同这个公式:

程序=框架SQL

今天,我们来谈谈这些公式。 先从CRUD开始吧

大多数开发Java的朋友都知道CRUD,即Create、Retrieve、Update和Delete这四个英语单词的首字母缩写。 翻译成中文的意思是【重新审视追加删除】

很多人把我们Java开发者称为“CRUD Boy”。 因为我们的工作内容一般都是针对数据库的增删修改。 有些人轻蔑地说,也许只能做CRUD

我想说的是,我只有CRUD怎么了? 软件开发的本质不就是CRUD吗?

请看大神JoshBloch(JDK的源代码创建者之一)编写的代码。 打开JDK的源代码,可以看到这两个类的源代码。

java.util.ArrayList

java.util.LinkedList

这两个类都包含常用的CRUD方法,如add、remove、set和get

以上,我只看到了大神Josh Bloch写的两个班。 看,大神写的代码也是离不开 CRUD 的

可以在任何类中打开。 类的大部分方法都无法逃避CRUD的四个操作

软件开发是信息技术,信息技术的本质是数据的处理,既然要处理数据,首先要解决数据存储的问题,也就是把数据add到某个地方,按照一定的规则进行存储

使用数据时,去保存数据的地方,按照一定的规则查指定的数据。 在某些情况下,您可能需要删除不需要的数据或更新已存在的数据。 简而言之,不就是数据的CRUD吗?

说到数据的存储,我们知道数据存储在磁盘上,但为了能快速的查询操作数据将数据组织到满足查询要求的结构中,包括线性结构、树结构甚至图表结构。 这就是众所周知的3358www.Sina.com/

作为Java开发,当我们通常处理关系数据时,数据存储在类似MySQL的关系数据库中。 关系数据库将数据组织成类似b树或b树的树结构,以提高数据库的CRUD效率

有了MySQL,Java业务开发就变得简单了。 根据业务情况只需写SQL即可。 这些SQL本质上是数据库或类似b树的数据结构的CRUD。

由此可见,MySQL中的所有数据都组织成了一个名为b树的数据结构。 而且,我们要写的每个SQL本质上是一个用于b树数据结构的CRUD,这些CRUD操作是基于b树数据结构的算法。 看这里,不是可以理解程序=数据结构算法这个公式吗?

我们站在SQL的立场上进行分析。数据结构是? 有了框架,我们就简单地使用框架给出的API就可以了,这里也可以说是程序=数据结构算法吗?

当我们脱下框架华丽的外套,看到其本质时,你的视野就会扩大。

以一个众所周知的Spring框架为例,Spring的核心功能是IOC,简言之,就是维护对象和对象之间的引用关系。 在此,可以将每个对象视为顶点,将对象和对象之间的参照视为边缘

而且边上有方向。 例如,如果对象a具有对象b的参照,则从顶点a到顶点b的边的方向是A-- B,表示对象a依赖于对象b

在一个系统中,有很多对象,对象和对象之间存在依存关系,从而形成有向图,不是吗?

也就是说,Spring管理的客体之间的关系本质上是有向图结构,Spring的所有功能都是基于有向图这样的数据结构上的CRUD来实现的

关于框架,如果放弃华丽的装扮,也可以知道本质上是数据结构算法

以上,我们站在整个框架的水平上看了数据结构和算法

实际上,对于所有包含成员变量的类来说,这都是一种数据结构,数据存储在类中的成员变量中,类中的方法基本上是CRUD成员变量中的数据。 这意味着类中的每个方法实际上都是一个算法

但是,要实现Spring这样的大型框架,需要成千上万个类。 这些班是怎么组织的呢? 这包括http://www.Sina.com/http://www.Sina.com /

所以,在面向对象的世界里,这样说可能更合适:

程序=数据结构算法设计模式

框架代码

g>

做面向数据库的 CRUD 的工作

调用框架提供的 API 

那么,你很容易被以下两种人所替代:

刚毕业的应届生,他们要求的薪资比较低,还喜欢干活

刚培训转行 Java 的人,他们刚转行,一开始要求也低

我们 Java 开发只会 CRUD ,这是没错的,而且是好事,但是如果你只会面向某种数据库 CRUD 的话呢,你就很容易达到瓶颈

其实,很多人带着轻蔑的语气说你只会 CRUD,很多时候他说的就是你只会面向数据库的 CRUD

这个时候,你会想着怎么提升?

重点来了,其实提升需要做到两个方面:横向提升 和 纵向提升

1. 横向提升

对于如何横向提升的话,我们向 JDK 源码大师 Josh Bloch 学习就可以了。

我们 Java 开发为什么容易达到瓶颈,其实本质上就是因为我们只懂面向数据库的 CRUD,或者说我们只懂面向 B 树这一种数据结构的 CRUD,也就是说技能太单一

你看 JDK 源码大师 Josh Bloch,他之所以厉害,是因为他不单单懂 B 树的 CRUD,他还精通 ArrayList、LinkedList、HashMap、TreeMap 等各种各样的数据结构的 CRUD

当然,你想提升的话,也不要求你对所有的数据结构的 CRUD 都精通,这也没必要,至少你需要对一些常用的数据结构精通,比如:数组、链表、栈和队列、二叉树、二叉查找树、AVL 树、红黑树、B 树、xxdwg表、堆和优先队列、跳表、字典树、图结构等

所以说,你如果真想提升的话,你首先要做的就是:掌握各种各样的常用的数据结构的 CRUD,这样你的视野会变得很开阔,编程能力也能得到非常大的提高,你被取代的概率就少了很多,这就是横向提升

掌握各种各样的比较基础的数据结构的 CRUD?这谈何容易,很多人会这么认为的,当然可能也包括你,就是觉得一个字:难

但是,如果把每一个数据结构的每个操作,拆解好了,然后再来学,你还觉得难吗?你可以体验下下面的两个例子

第一个例子:删除双向链表中指定索引的节点

第二个例子:平衡二叉树 - AVL 树中增加元素时的右旋转操作

除了数据结构,算法也是一个非常重要的部分,可以这么说:数据结构与算法就是程序的灵魂了,同时也是一个 Java 程序员安身立命的核心竞争力所在

对于算法的话,我们一定要培养自己的算法思维,对于程序一步一步的选择合适的数据结构,然后达到优化程序的目的,我们来看一个算法问题

这个算法问题是 leetcode 里面的第 1 号算法题:两数之和

题目描述:

给定一个整数数组 nums 和一个目标值 target

请在数组中找出和为目标值两个元素,并返回它们的数组下标

注意:数组中同一个元素不能使用两次

示例如下:

输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

如果上面的题目描述你没看懂的话,可以看下面视频解释,如果题目你已经懂了,下面的视频可以跳过呢

当面对一个算法问题时,先尝试使用最简单、最暴力的解法来解决,这道算法题的暴力解法就是线性查找,看下面的视频讲解:

当暴力解法的时间复杂度很高的时候,我们可以尝试对暴力解法进行不断的优化,请先看使用二分查找来优化算法:

二分查找虽然可以优化降低时间复杂度,但是还有一个时间复杂度更低的xxdwg查找,接下来我们来看看怎么使用xxdwg查找,进一步降低时间复杂度:

接下来就是追求算法的极致性能,只有这样,才能培养你的算法思维,提高你的编程水平,看下面对这个算法的进一步优化:

你看,对于算法,就应该这样去不断的训练,训练多了,你还怕算法和数据结构吗?你还怕写代码吗?

如果,这样学习数据结构,这样刻意练习算法的话,相信,在很短的时间内,你的编程能力会提高好多个档次的

因为篇幅的原因,这里我也只能放一个算法的讲解,更多的数据结构与算法的学习和练习,请长按下面的二维码,然后可以查看:

说完横向提升,接下来,我们再来讨论同等重要的纵向提升

2. 纵向提升

所谓纵向提升,就是针对每个常用的技术,往深处学习,比如 Spring、MySQL 等技术

不管你怎么学习这些技术,你永远绕不开每个技术对应的底层数据结构的话题

比如你想学习 MySQL 的话,你就得搞懂 B 树或者 B+ 树这种数据结构,对基于 B 树或者 B+ 树之上的算法也是需要搞懂的

比如你想深入学习 Spring,甚至说你想看 Spring 的源码,那么你就需要对图结构及其算法搞懂

我们有很多人尝试去看 Spring 源码,但是很多人都放弃了,因为觉得看不懂,甚至去网上看一些老师讲源码的视频,但是也很难看懂,其根本的原因就是你、甚至讲源码的老师都不懂图这种数据结构及其算法

可以看出,不管是横向提升还是纵向提升,你都绕不开一个很重要的话题,那就是【数据结构与算法】

那么,数据结构与算法这么重要,为什么很多人会不知道呢?

这是一个事实

数据结构与算法在实际工作中的确很少会用到,这是一个事实,在平时的业务开发中,用到数据结构与算法的地方比较少。

虽然不得不承认,懂数据结构与算法是很牛逼的一件事,但是,即使你不懂,也可以解决 80% 的问题。

不利于求职

面试中 70% 的题目与数据结构与算法有关,这也是一个事实

随着时间的推移,企业面试越来越重视数据结构与算法了,大厂的第一关便是算法,很多中小企业,也会问上一两道算法编程题,如果,你不会的话,基本就和工作无缘了。

那为什么数据结构与算法在工作中明明用不到,却在面试中频频提到呢?

首先,数据结构与算法在面试中比较好考察,相对来说也比较公平,还可以看出这个人码代码的功力

其次,解决数据结构与算法问题的能力,同时可以反应出一个人的思维能力,也能间接看出这个人在日后工作中,解决问题的能力、学习能力和成长潜力

职业高度受限

在软件开发行业,从来都是算法先行,次基础,技术为末。这也是程序员从业者金字塔的层级关系分布

在数据结构与算法知识匮乏的情况下,工作三五年之后,大约可以达到中级水平,但是很难达到高级程序员水平,导致你的事业发展遇到瓶颈,升不上去,这也是一个事实

最不能接受的是,35 岁以后,你的编码能力一定下降的,你写代码绝对不如 25 岁的程序员快,效率高

这时候,如果你对于各种算法和数据结构的认知还是处于入门级或者中级阶段的话,最终结果就是,随着年龄的变大而不得不面对所谓的程序员中年危机了

其实,很多人觉得数据结构与算法很难学,觉得非常遥远,但是如果你跟着老汤学习的话,那么这些知识并不难的,也不遥远的:

如果你不想只会业务开发的话,你要做的就是跟着老汤学习数据结构与算法:

如果你能从大学毕业,那说明,你并不比任何人差,为什么别人能学好数据结构与算法,而你却学不好呢?并不是因为难学,最重要的原因是你没有碰到好的老师

来,长按扫码,跟着老汤一步一步走,只要你是从大专及以上毕业的,你就可以学会数据结构与算法的:

???? 点「阅读原文」跟老汤一起拿下数据结构与算法,就今天。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。