构建自己的算法体系
# 构建自己的算法体系
# 一、体系
# 1.1什么是体系
体系就是在规定范围内,不同单位个体依照某种规律或秩序联系在一起的整体,是不同却又在某范围内的独立个体因为他们之间的联系而组成的一个系统。
# 1.2为什么要建立体系
其实从小到大我们总会发现有些人就是神一般的存在着,让我们感觉无法超越,他们知识广博且又深入。以前我觉得是天赋,但现在我认为不是。他们是有一套建立知识体系的学习方法。当你建立起了某个知识的自己的体系的时候这个知识就很难忘记了。为什么?因为类型相似的知识之间建立起了联系,人类其实最不擅长的就是背诵,人类擅长的是理解和构建联系。当碎片化的知识点之间又了联系有了根茎叶,那么当一个知识点被记起来所有知识点也都唤起了回忆。
# 1.3如何才能将题做透
第一种:做的这个题背后的知识点能讲出来,能背过,张嘴就能说,给大家说明白基础知识
第二种:能够书写完整解题过程 ,这个题目因为什么,所以什么,根据什么,所以什么,这一阶段主要梳理逻辑思路
第三种:费曼学习法,给别人讲,给自己讲.用生活中的语言来说明
第四种:要学会把题目模型化,这一道题就要发挥一类题的作用.这一类题都是遵循什么样的原理,利用什么样的知识点,使用了一个什么样的技巧, 解题的过程中,我们的思路是什么,解答的套路是什么,把一道题做成一类题,一道题发挥10道题的作用,有总结有输出哪就是你沉淀下来的结论经验技巧
# 1.4记忆的诀窍
第一招:冥想回忆法:
读完一遍知识点内容后,在白纸上梳理一遍整个知识点的框架,然后在脑海中梳理一遍,接着再去复习记忆,你会发现很多不同的地方,仿佛瞬间被打通了背书的任督二脉
第二招:框架加关键词法
第一步:复习时拿一张白纸,在纸上默写框架和关键词,将这一章节全部默写一遍,默写不出来的话,就想像你现在在考试,给他硬编一个答案,也得把这一章过了
第二步背完一章,去翻书,把你和书上不一样的地方用红笔勾出来,会发现书上的包子真的老高级了,会有一种恍然大悟的
第三步就是把红色的部分就是没编出来的再背一遍,等下次你再默写,你就会发现那种恍然大悟的高级句子了,你印像特别深刻,不自觉的就记住了.
第三招:番茄工作法,干25分钟,休息5分钟
# 1.5 时间点复习法
第一时间点在早上:
当前新内容背诵结束完成之后,要进行一次回忆,在整个回忆过程当中,是不允许翻书的,准备一张白张或是ipad,然后默写出刚刚背诵的这一章的框架结构,先写出框架结构,再细化出具体内容 ,对于大段内容的阐述,我们可以只采用关键词,对于想不起的地方也不要翻书,做上标记之后,继续往下回忆直到这一章完全结束,然后我们再翻开书本,着重去记忆这些薄弱的知识点,边写边背是为了帮助你集中注意力,防止你在这个过程中分心,以及他也能真正帮助你检测出,你到底能够记住多少,所以你在写的时候,根本不需要写的多规整
第二个时间点在临睡前 ,
将早上背过的内容,再回忆一遍和早上的规矩是一样的,全程不允许翻书
第三个时间点,在开始学习新知识之前,要把昨天的旧知识,再回忆一下 ,这个时候你会发现,你能记住90%的内容
# 算法与数据结构的根基
好了知道什么是体系我们就可以构建它。首先我们要知道算法和数据结构也只是整个计算机科学体系的一部份,相当于整个大体系的根基部分。
这个专栏里我们只是去构建算法与数据结构的体系。
其实算法和数据结构的的根基非常简单,故名思义就是算法和数据结构。这个体系的所有枝叶都发散与这两部分根基。
# 什么是数据结构?什么是算法?
大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。
虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。 下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。
那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。
从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。
那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?
这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。
比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。
# 算法与数据结构的枝叶
学习算法与数据结构的意义就在于优化程序节省空间和时间,所以算法与数据结构最重要的分支就是 复杂度分析 。
在复杂度之后的分支是 20 个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这 20 个知识点就足够了。
10 个数据结构 :数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
好了我们的算法与数据结构的枝干算是建立好了,剩下的叶片需要我们变学习边往上添加了,下面我画了一个算法与数据结构的体系图,再之后的学习记录中回严格按照该体系去进行反刍与知识间的连接建立,希望可以形成牢固的数据结构与算法的体系框架。
掌握了这些基础的数据结构和算法体系,再学更加复杂的数据结构和算法,相信就是在此基础上添加上层枝叶,就会非常容易、非常快。
在学习数据结构和算法的过程中,也要注意,不要只是死记硬背,不要为了学习而学习,而是要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。