数据结构与算法是编程的基本功,当你算法掌握愈来愈深的时候你会发现写代码的时候,会不禁自主考虑不少性能方面的问题。写出时间复杂度高、空间复杂度高的垃圾代码愈来愈少了,算法能力提高了不少,编程能力也有了质的飞跃。程序员
首先一个三连问。面试
是否是从学校开始,你就以为数据结构难学,而后一直没认真学?算法
工做中,一遇到数据结构这个坑,你又发自本能地迅速避让,由于你以为本身不懂,因此也不想深究,反正看起来无关大局?数据库
当你想换工做面试,或者研究某个开源项目源码,亦或者和团队讨论某个非框架层面的高可用难题的时候,你又发现,本身的基础跟不上别人的节奏?编程
若是你有这种状况,其实你并不孤独。这不是你一我的遇到的问题。工做十间,见过许多程序员。他们有着各类各样的背景,有不少既有潜力又很是努力,但始终没法在本身现有水平上更进一步。少年不要慌,青叶带你跨越算法这道坎。数组
在技术圈里,咱们常常喜欢谈论高大上的架构,好比高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是百里挑一。网络
基础知识就像是一座大楼的地基,它决定了咱们的技术高度。而要想快速作出点事情,前提条件必定是基础能力过硬,“内功”要到位。数据结构
那技术人究竟都须要修炼哪些“内功”呢?我以为,无外乎就是大学里的那些基础课程,操做系统、计算机网络、编译原理等等,固然还有数据结构和算法。架构
发车了,算法专栏如今开始。伙计们快上车!!并发
入门篇
时间、空间复杂度分析是数据结构和算法中很是重要的知识点,贯穿整个专栏的学习过程。但同时也是比较难掌握的。
基础篇
这部分是专栏中篇幅最大的内容,也是咱们学习的重点,计划共有 26 节内容,涵盖了最基础、最经常使用的数据结构和算法。针对每种数据结构和算法,我都会结合具体的软件开发实例,由浅入深进行讲解
高级篇
这部分我会讲一些不是那么经常使用的数据结构和算法。虽然不经常使用,可是这些内容你也须要知道。设置这一部分的目的,是为了开拓视野。
实战篇
我会拿一些开源项目、框架或者系统设计问题,剖析它们背后的数据结构和算法,让你有一个更加直观的感觉。
你是否是以为数据结构和算法,跟操做系统、计算机网络同样,是脱离实际工做的知识?可能除了面试,这辈子也用不着?
还有一些人也只据说过数组、链表、快排这些最最基本的数据结构和算法,稍微复杂一点的就彻底没概念。
固然,也有不少人说,本身实际工做中根本用不到数据结构和算法。因此,就算不懂这块知识,只要 Java API、开发框架用得熟练,照样能够把代码写得“飞”起来。事实真的是这样吗?
不少大公司,好比 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。有些人虽然技术不错,但每次去面试都会“跪”在算法上,非常惋惜。那你有没有想过,为何这些大公司都喜欢考算法呢?
是的,对于大部分业务开发来讲,咱们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,不多须要本身实现数据结构和算法。可是,不须要本身实现,并不表明什么都不须要了解。
做为业务开发,咱们会用到各类框架、中间件和底层系统,好比 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,通常都揉和了不少基础数据结构和算法的设计思想。
好比,咱们经常使用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为何要用跳表来实现呢?为何不用二叉树呢?
我以为,高手之间的竞争其实就在细节。这些细节包括:你用的算法是否是够优化,数据存取的效率是否是够高,内存是否是够节省等等。这些累积起来,决定了一个框架是否是优秀。因此,若是你还不懂数据结构和算法,没据说过大 O 复杂度分析,不知道怎么分析代码的时间复杂度和空间复杂度,那确定说不过去了,赶忙来补一补吧!
你可能会说,我在小公司工做,用户量不多,须要处理的数据量也不多,开发中不须要考虑那么多性能的问题,完成功能就能够,用什么数据结构和算法,差异根本不大。可是你真的想“十年如一日”地作同样的工做吗?
咱们学习数据结构和算法,并非为了死记硬背几个知识点。咱们的目的是创建时间复杂度、空间复杂度意识,写出高质量的代码,可以设计基础架构,提高编程技能,训练逻辑思惟,积攒人生经验,以此得到工做回报。
你是否曾跟我同样,由于看不懂数据结构和算法,而一度怀疑是本身太笨?实际上,不少人在第一次接触这门课时,都会有这种感受,以为数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个缘由,让不少初学者对这门课望而却步。
真正的缘由是没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东西并很少,经常使用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并无看上去那么难,更不须要什么高智商、厚底子。
大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。可是,这些定义都很抽象,对理解这两个概念并无实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,咱们如今学习,并非为了考试,因此,概念背得再牢,不会用也就没什么用。
虽然咱们说不必深挖严格的定义,可是这并不等于不须要理解概念。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操做数据的一组方法。
数据结构是为算法服务的,算法要做用在特定的数据结构之上。 所以,咱们没法孤立数据结构来说算法,也没法孤立算法来说数据结构。
好比,由于数组具备随机访问的特色,经常使用的二分查找算法须要用数组来存储数据。但若是咱们选择链表这种数据结构,二分查找算法就没法工做了,由于链表并不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。若是不在它的基础上操做、构建算法,孤立存在的数据结构就是没用的。
数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,所以,咱们就须要一个考量效率和资源消耗的方法,这就是复杂度分析方法。因此,若是你只掌握了数据结构和算法的特色、用法,可是没有学会复杂度分析,那就至关于只知道操做口诀,而没掌握心法。只有把心法了然于胸,才能作到无招胜有招!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了全部数据结构和算法书籍中都会讲到的知识点。
这里面有 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
话很少说不服就干,关注公众号持续更新。在这里问你们一个问题,对于 HashMap 的时间复杂度是多少呢?并发拓容场景下 HashMap 会有什么问题呢?
欢迎关注公众号后台回复关键字 “HashMap” 获取问题答案也能够回复 加群,在技术群表达你的观点。