现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处。这也是我写这些博客的初衷,我会讲解java实现的数据结构和算法。
至于说为什么要学习数据结构和算法,我相信大家都应该清楚。大家平时的工作,敲的业务代码,都属于外功,可以帮你轻松地完成老板交待的工作,每个月能挣到属于自己的那份钱。但我不知道小伙伴们有没有这样的困境,工作三到五年,项目做了很多,但自己的能力始终处于二流水平,写业务代码,没点问题;想跳槽面试,发现面试官问的问题都很底层,跟自己平时的工作风马牛不相及。为什么会出现这样的情况呢?
是因为我们的底子薄了,平时积累的也不够。很多人都这样举例:编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱。一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程。但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度。那么爬坡时使用1档,便可以获得更大的牵引力;下坡时便使用低档限制车的行驶速度。回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,数组还是ArrayList,或者HashSet,或者别的数据结构。如果不懂数据结构的,可能随便选择一个容器来存储,也能完成所有的功能,但是后期如果随着学生数据量的增多,随便选择的数据结构肯定会存在性能问题,而一个懂数据结构和算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,会极大的提高程序的性能。
我想,如果你懂数据结构和算法,那你的薪资必然是要比不懂的朋友或同行要高的,因为当他还在面向百度编程的时候,你已经直指了问题的核心,你会用更底层更优雅的方式去解决你所面对的问题。这就是数据结构和算法的魅力,也是我接下来要跟大家聊的内容。
曾经一位哲人说过:程序=数据结构+算法。
数据结构是程序的骨架,算法是程序的灵魂。那我们就从骨架和灵魂来开始我们的程序之旅吧。
一、数据结构
百度百科:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
1.数据结构的基本功能
①如何插入一条新的数据项
②如何寻找某一特定的数据项
③如何删除某一特定的数据项
④如何迭代的访问各个数据项,以便进行显示或其他操作
2.数据结构的分类
3.关于几种数据结构的优缺点,来个网络图
这些数据结构我们在后面都会讲到,请朋友们不要着急。
二、算法
百度百科:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
在我们的java中,算法通常都是由类来实现的,前面给大家列举的数据结构,除了数组(注意,数组很特殊,后面会单独讲),都是由类来实现的,算法解决了什么问题呢?
算法解决的就是如何更快速、更有效地对数据结构进行操作的问题。为什么我们有些数据结构查找快,而有些数据结构新增删除快,这都是由实现这些数据结构的算法决定的。
1.算法的特征
①有穷性(Finiteness)
算法的有穷性是指算法必须能在执行有限个步骤之后终止;
②确切性(Definiteness)
算法的每一步骤必须有确切的定义;
③输入项(Input)
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
④输出项(Output)
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
⑤可行性(Effectiveness)
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
2.算法的设计原则
其实没那么多废话,就一条:最短时长,最短路径。
具体而言,我们设计的算法,应该是要么满足高效率,要么满足低存储。二者不可得兼。
有些时候,我们会拿时间换空间,有时又是以空间换时间。
具体应该怎么设计,要具体情况具体分析,哲人说过,没有最好的算法,只有最合适的算法。至于这个哲人是谁,还是请各位看官自己去想吧。
以上,就是我对数据结构和算法的概述,我会用大概30篇的章节给大家进行讲解,争取讲到讲透,也谢谢看官老爷们的支持。我们一起努力。
我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!
参考文章:
- https://www.cnblogs.com/ysocean/p/7889153.html
- https://blog.csdn.net/weixin_43802541/article/details/89204221
参考书籍:参考书籍:《Java数据结构和算法》(请支持正版)