前言
数据结构是计算机领域专业必学的知识点,因为数据结构研究的就是数据如何在计算机中进行组织和存储,从而高效
的获取数据或者修改数据。
有时可以让我们根据不同的应用,灵活选择最合适的数据结构继而解决相应的问题。
不要完美主义。掌握好“度”。
太过于追求完美会把自己逼的太紧,会产生各种焦虑的心态,最后甚至会怀疑自己,温故而知新,不要停止不前,掌握好这个度,不存在你把那些你认为完全掌握了,然后就成了某一个领域的专家,相反一旦你产生很浓厚的厌恶感,那么就意味着你即将会放弃或者已经选择了放弃,虽然你之前想把它做到 100 分,但是由于你的放弃让它变为 0 分。
学习本着自己的目标去。不要在学的过程中偏离了自己的目标。要分清主次。
难的东西,你可以慢慢的回头看一看。那样才会更加的柳暗花明,更能提升自己的收获。
数据结构的三种结构
线性结构:数组;栈;队列;链表;哈希表;...。
树结构:树结构是在计算机领域里非常大的数据结构家族了, 有二叉树;二分搜索树;AVL树;红黑树;Treap;Splay;堆;Trie;线段树;K-D树;并查集;哈夫曼树;...。
图结构:邻接矩阵;邻接表;...。
如何学习数据结构嘞?
当时学的时候,老师说:难的东西,你可以慢慢的回头看一看。那样才会更加的柳暗花明,更能提升自己的收获。
没错,是这样的。后面我会陆续把整理好的文章逐一输出的。
先了解各个数据结构和底层实现原理。只要能够了解这些数据结构,并且对底层进行了实现,自然也了解了某些数据结构的应用。当你对数据结构已经有比较全面的认识了,随着时间的推移,你的水平越来越好了,什么数据结构算法题、非常复杂的情况下的应用等等,也会随之而解决。当然还是那句老话:光看文章能够掌握两成,动手敲代码、动脑思考、画图才可以掌握八成。源码仓库
数据结构突出的应用场景
数据结构本身就是大量的算法的基石。 算法本身在计算机领域是无处不在的,游戏其实涉及大量的算法,如 寻路算法,点击地图中某一个点,开始进行计算人物到这个点的路,而且必须要绕过所有的障碍物,甚至还需要找出其中多一个路径中最短的那个,这个实际上涉及到了最经典的图论算法,在图论算法中也使用了大量的数据结构,如 借助栈来进行DFS深度优先遍历,或者使用队列来进行BFS广度优先遍历。
近乎所有的算法必须以数据结构为基石,在具体的使用相关算法逻辑过程之前,这些数据就先需要以某种数据结构进行组织了。计算机领域有一个至理名言:数据结构+算法=程序
。任何有关算法的书籍,必定会有大量的篇幅来讲解数据结构的相关知识点。
数据库
为啥你使用SELECT * FROM 数据结构 WHERE name="数组"
,就能查到相应的数据嘞?因为在数据库软件中使用了大量的数据结构噢,比如 树结构:AVL;红黑树;Treap;伸展树;B树;嗯还有一个非常重要的数据结构:哈希表。如果没有数据库的话大部分互联网上的应用都是无法运转的。
操作系统
操作系统中也使用了非常多的数据结构噢。例如操作系统都是支持多任务的,多任务间快速切换这个功能就需要涉及到数据结构,如 系统栈、优先队列:堆。当你在使用递归调用时就需要借助系统栈这样的空间来完成递归过程,而堆这种数据结构就用于组建优先队列这样的一个结构,有了优先队列,操作系统才可以快速的在多个任务之间去比较他们之间的优先级,从而来进行任务的切换。
文件压缩
RAR压缩软件、PNG图片、MP3/MP4、PDF,它们本身都是对不同的文件进行了一定的压缩处理,才会形成这种专门的文件格式。文件压缩的时候也需要借助数据结构,最基础的压缩算法使用的数据结构是哈夫曼树,这种数据结构非常简单。尽管现在很多压缩算法都不用他了,改用更复杂的数据结构,但是它依旧是经典。
通讯录
存储不同的联系人,在很久之前使用的就是最为普通的线性结构:链表,但是会发生一个问题,当你通讯录中的联系人非常多的时候,查找起来特别的慢。现在使用的是Trie(前缀树)这种数据结构了。使用了这种数据结构之后呀,查找就特别的快了,不管你的通讯录中有多少联系人都很快。
前端为什么学习数据结构
如果你只是希望使用现有的工具搭建出一个简单的产品,那不需要使用什么数据结构和算法。你做的事情的关键可能在于你的项目的业务逻辑、程序设计、交互设计、程序编码等等这方面的内容,就算你在技术上真正的遇到了瓶颈,花点钱去请求业内的专家来帮助你也是可以解决。
不过一旦你想在计算机技术这条路上走得更远或者你想成为那样的技术专家,那么数据结构就是必不可少的一部分。
为了应付面试或者考试去学数据结构(和算法)
这个其实也对,在开发工程中,你只需要使用第三方库的api、以及开发工具、编程语言,就能开发出一个app或者网站来,这样的门槛毋庸置疑的确不高。
但是只是使用工具来构建app或者网站,随着时代的发展,这些操作实际上会越来越简单, 在技术上也会越来越简单。如果想做一个成功的网站或者app,那还有其它的因素需要考量,市场也好、流量也好、运营也好、产品设计也好、 等等。
对于计算机行业来说,也许你最关心的是技术,随着技术越来越发达,使用现有的开发工具去拼凑出一个产品会日渐容易,甚至在以后这部分工作根本就不需要计算机行业的人来做,因为工具已经足够的简单足够的发达,从而创造产品的人将从技术细节中解放出来,会把更重要的精力放在诸如创意、产品设计、交互体验等这些方面。
综上所述,那么学习数据结构(和算法)就只是用来应付面试或者考试了。
不为了应付面试或者考试去学数据结构(和算法)
仅仅是简单业务逻辑的搭建产品,那几乎用不到数据结构和算法。但是如果你的产品使用的人数很多,产品功能越来越多、业务逻辑也很复杂,产品变得越来越庞大,那么开发者不仅仅需要解决功能需求上的问题,还需要解决很多计算机科学上的问题。在这种时候数据结构包括算法将会发挥巨大的作用,学好数据结构将会大大的提高你的技术上限,可以让你在计算机行业这条道路上走得更加远。
比如你亲自搭建第三方库,亲自搭建开发工具及环境,或者自己创建编程语言等等,那么就会大量的使用到数据结构和算法。
无论是底层操作系统或者是移动操作系统开发以及优化,包括不同的数据库、编程语言、不同的开发环境、第三方库及框架,在开发这些工具的时候就会使用到大量的数据结构,这些底层的一些工具、框架、IOS、Windows、Linux、Redis、MySQL、MongoDB、Swift、Android、React、Typescript、Vue、Angular都是大的公司、大的团队开发出来的,所以越大的地方就越需要拥有扎实数据结构(和算法)功底的人。
大的公司也会做那些关于将业务逻辑组装成产品的工具,但是这些大的公司更重要的是做一些底层的基础开发,他们要设计出更新的操作系统、做出更好的数据库、开发更优秀的框架、面向的是现在还没有的下一代的技术。
综上所述,为了达到这样的目的,数据结构和算法就必不可少。并不是用来应付面试或者考试噢。
总结
数组、栈、队列、链表、二分搜索树、堆,这些数据结构是非常基础的,手写也不为过。线段树、Trie、并查集,AVL、红黑树、哈希表难一些,但是你弄懂了这些也就领悟到了数据结构的灵活性和优势,只是处理对象变了就能够设计出更优的数据结构,更好的快速完成需要的任务。
AVL、红黑树、哈希表这三种可能相对复杂些,AVL和红黑树本身都是平衡二叉树的实现,哈希表也是一种非常常用的数据存储结构,但也是可以更好的理解性能分析上的问题。比如红黑树不是一个完全的平衡二叉树,因为就会产生很多的一些问题,哈希表会和冲突检测相关时就会产生很多和性能分析相关的一些问题。
对于图结构而言本身存储一个图其实非常简单的,使用简单的线性表就可以存储了,但是图论本身是一个非常庞大的领域,在这个领域中主要是以算法为主的,比如说 计算最小生成树、计算最短路径、计算最大连通分量等等。
实际工作中,这些结构很少会从底层去实现,更多的是调用第三方库或者内置的功能接口来使用,但深入理解可以提升自己的计算机内功,对一些高级数据结构处理的方式以及在处理问题的过程中可能会遇到其它问题的分析包括性能上的分析都是有好处的。
去实现它们,理解数据结构领域相应的知识,能极大的提升编程水平。并不是简单实现就行噢,要强调比较和优化,对于每一个数据结构背后的思考,以及这些思考它们到底有什么不同呀,还有为什么要产生这些不同的实现方式呀,以及一些优化的方法,通过比较来看到这些优化方法产生的具体作用,从而能够对数据结构产生比较全面的认识。
小说明
3年前花大半年时间学习数据结构,但是当时输出的内容格式并不是很友好,所以想想还是花时间再过一遍,整理整理将输出方式友好一点再输出吧,原来的文章地址:【从蛋壳到满天飞】JS 数据结构解析和算法实现