【数据结构与算法】1、入门篇

以前换工做的时候,好多公司都喜欢在面试的过程当中考察数据结构、算法,甚至手写代码,尤为是大厂。面试

回想我从刚开始工做至今,一直局限于公司业务之中,成天作的无非是 CURD,外加疑难杂症定位解决,可是更多的时候,是利用其余人已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,不多须要本身实现数据结构和算法。算法

因此数据结构和算法算是个人软肋,数据结构只会一些简单的数组、链表、树,算法也只是粗略的掌握了几种经常使用的排序算法。数据库

显而易见,凡是面试时要我手写数据结构与算法相关代码的,我无一例外的都挂了。为了避免让数据结构和算法拖我后腿,我报名参加了王争老师的《数据结构与算法之美》的训练营,决心补齐本身的短板。编程

接下来的一段时间,我会根据本身的学习进度,逐步的更新《数据结构与算法》系列博文,记录本身的学习成长的历程。数组

在学习以前,先摘录了王争老师的一些对数据结构和算法的看法,书于此处,以做入门。数据结构

学数据结构和算法的好处?

上面有提到,刚开始工做的时候,只是一名业务研发人员,写代码历来都只是完成功能,不考虑非功能性的需求,更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,不多须要本身实现数据结构和算法;框架

再加上所处行业的局限性,最终致使的结果就是,虽然经历的项目有几十个,简历写了好多页,可是细看下来,每一个项目都是重复的堆砌业务逻辑而已,彻底没有难度递进,没有能力的提高,只是日复一日的搬砖,成为名副其实的 IT 民工。数据结构和算法

可是,不须要本身实现,并不表明什么都不须要了解。函数

若是不知道平常使用的这些类库背后的原理,不懂得时间、空间复杂度分析,如何能利用好、用对它们?存储某个业务数据的时候,如何评估到底该使用 ArrayList 仍是 LinkedList 呢?调用了某个函数或方法以后,又该如何评估代码的性能和资源的消耗呢?性能

平常的开发中,咱们会避免不了使用各类框架和中间件,好比 Spring、Redis 等等。在这些基础框架和中间件当中,通常都糅合了不少的基础数据结构和算法的设计思想。好比咱们经常使用的 Key-Value 数据库 Redis,里面的有序集合是用什么数据结构来实现呢?为何要用跳表来实现呢?为何不用二叉树呢?

若是可以弄明白这些底层原理,就能更好的使用它们。即使出现问题,也很容易就能定位,所以,掌握数据结构和算法,无论对于阅读框架源码,仍是理解其背后的设计思想,都是很是有用的。

数据结构与算法对编程能力的提高是否有帮助?

怎么评判一我的的编程能力?可能有的人会提到可读性、健壮性、可扩展性这些指标。其实评判一我的的编程能力的指标有不少,可是,代码性能绝对是其中一个很是重要的评判标准。

但是若是连代码的时间复杂度、空间复杂度都不知道怎么分析,怎么写出高性能的代码呢?

若是你在一家成熟的公司,面对的是千万级甚至亿级的用户,性能几乎是开发过程当中时刻都要考虑的问题。一个简单的 ArrayList 、LinkedList 的选择问题,均可能产生成千上万倍的性能差异。这个时候,学习数据结构和算法的意义就凸显出来了。

学习数据结构与算法的真正目的

并非为了死记硬背几个知识点。

咱们的目的是简历时间复杂度、空间复杂度意识,写出高质量的代码,可以设计基础框架,提高编程技能,训练逻辑思惟,积攒人生经验,以此得到工做回报,实现你的价值,完善你的人生。

因此,无论你是否是业务开发工程师,是否是初入职场的初级工程师,数据结构和算法做为计算机的基础知识、核心知识,都是必需要掌握的。

掌握了数据结构与算法, 看待问题的深度、解决问题的角度,就会彻底不同。

什么是数据结构?什么是算法?

从广义上讲,数据结构就是指一组数据的存储结构算法就是操做数据的一组方法

从狭义上讲,就是特指某些著名的数据结构和算法,好比队列、栈、堆、二分查找、动态规划等。这些都是前人的只会结晶,咱们能够直接拿来用。

数据结构是为算法服务的,算法要做用在特定的数据结构之上。所以咱们没法孤立数据结构来说算法,也没法孤立算法来说数据结构。数据结构是静态的,它只是组织数据的一种方式,若是不在他的基础上操做、构建算法,孤立存在的数据结构就是没用的。

如何学习数据结构与算法?

想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念 -- 复杂度分析。

这个概念有多重要呢?能够这么说,它几乎占了数据结构和算法这门课程的半壁江山,是数据结构和算法学习的精髓。

搞定复杂度分析,就要进入数据结构与算法的内容了。

王争老师在训练营里面总结了 20 个最经常使用的、最基础的数据结构与算法,不论是应付面试仍是工做须要,只要集中精力逐一攻克这 20 个知识点就足够了。

这里面包括 10 个数据结构

  • 数组
  • 链表
  • 队列
  • 散列表
  • 二叉树
  • 跳表
  • Trie 树

包括 10 个算法

  • 递归
  • 排序
  • 二分查找
  • 搜索
  • 哈希算法
  • 贪心算法
  • 分治算法
  • 回溯算法
  • 动态规划
  • 字符串匹配算法

学习数据结构与算法的过程,是很是好的思惟训练的过程,因此,千万不要被动地记忆,要多辩证地思考,多问为何。若是你一直坚持这么作,你会发现,等你学完以后,写代码的时候就会不禁自主地考虑不少性能方面的事情,时间复杂度、空间复杂度很是高的垃圾代码出现的次数就会愈来愈少。你的编程内功就真正获得了修炼。

王争老师提供的一些事半功倍的学习技巧

一、边学边练,适度刷题

“边学边练”这一招很是有用。建议每周花 1-2 个小时的时间,集中把学习的数据结构和算法,全都本身写出来,用代码实现一遍。这样必定会比单纯地看或者听的效果要好不少。

至于“刷题”,能够“适度”刷题,但必定不要浪费太多时间在刷题上。学习的目的主要仍是掌握,而后应用。

二、多问,多思考,多互动

学习最好的方法,是找到几我的一块儿学习,一起讨论切磋,有问题及时寻求帮助。

三、打怪升级学习法

学习的过程当中,最大的问题就是坚持不下来。因此,咱们在枯燥的学习过程当中,也能够给本身设立一个切实可行的目标,就像打怪升级同样。

四、知识须要沉淀,不要想一会儿掌握全部

在学习的过程当中必定会遇到“拦路虎”,若是哪一个知识点没有怎么学懂,不要着急,这是正常的。由于,想听一遍、看一遍就把全部知识掌握,这确定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。

最后,附思惟导图一张,一样取自王争老师的训练营,用于描述完整的数据结构与算法知识体系(侵删):

IMG_0881.JPG

相关文章
相关标签/搜索