程序员的进阶课-架构师之路(1)-数据结构与算法简介
现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是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数据结构和算法》(请支持正版)
程序员的进阶课-架构师之路(1)-数据结构与算法简介相关推荐
- 程序员的进阶课-架构师之路(17)-堆
我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...
- 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
- 程序员的进阶课-架构师之路(18)-图
一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...
- 程序员的进阶课-架构师之路(7)-树的概念
接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...
- 程序员的进阶课-架构师之路(5)-队列
一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...
- 程序员的进阶课-架构师之路(4)-栈
一.栈的定义 [百度百科]栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据 ...
- 程序员的进阶课-架构师之路(3)-线性表
一.线性表的定义 [百度百科]线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...
- 程序员的进阶课-架构师之路(2)-数组
从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组. 在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样 ...
- 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
最新文章
- mysql数据库每秒能写入多少条数据_数据库插入速度能有50W每秒吗
- 手把手教你用anaconda安装pytorch最新版
- 自学python后能干什么-学习python后能做哪方面的工作
- 逃离美股!瑞信给出了11个理由
- 本机电脑与 Android 设备如何进行文件传输?
- 十面阿里,菜鸟,天猫,蚂蚁金服题目总汇
- 快速入门 Jupyter notebook
- java when for where_JAVA_EE_MyBatis之动态SQL
- 电商项目---完成内容管理cms系统
- 2015年我走过的日子
- 数学 导数表 求导公式求导法则
- word文档字不靠边_word怎么调整单元格文字边距表格文字紧靠边框怎么办
- SQL注入原理及绕过技术
- 微信开发 (四) 微信网页授权
- mavennexus环境搭建
- 复变函数(1)-复数及其几何属性
- 怎样清除浏览器缓存?
- Linux如何检测到僵尸进城,如何在linux下查看僵尸进程
- 9.二重循环:什么是二重循环???
- linux设置steam为中文,Linux下Steam中支持中文的办法