Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何学习算法-二毛个人经验 #5

Closed
Minya2020 opened this issue Feb 26, 2021 · 0 comments
Closed

如何学习算法-二毛个人经验 #5

Minya2020 opened this issue Feb 26, 2021 · 0 comments
Labels

Comments

@Minya2020
Copy link

【】如何学习算法-二毛经验

前言

大家好呀,我是毛小悠,大家可以叫我二毛。

鉴于有多个小伙伴问我如何学习算法,所以打算写一篇“如何学习算法”文章。

这里只是个人的学习经验,仅供参考。我只是一个学习者。

学习一个任何一个东西前,先多问自己几个问题。

  1. 你要学习的内容是什么?

  2. 你要如何学习?

  3. 你为了什么而学习?不同的目的有不同的学习路线。比如你是为了面试,为了提高自己的技术,还是为了竞赛?

  4. 你学到什么程度才算学好了?

  5. 你愿意为之花费多少时间和精力?

什么是算法

根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

有一个很著名的公式 “程序=数据结构+算法”。

数据结构是数据的组成方式。

算法是一些基础运算和规定的顺序构成。

对算法的认知

在我看来,算法和数学有着很多的相似之处,都是有少量的概念和无限的题目,都非常考验一个人的动脑能力。

完全可以套用学习数学的方式来学习算法。你还记得你如何彻底掌握一个数学公式的么?是通过反复的解读。

数学题有多个步骤,算法也同样如此。

我经常看到不少小伙伴通过大量的刷题,然后告诉我说,刷完一个题目,过几天就忘记了。

但本质原因是他并没有彻底掌握这道题目。

算法实质是对思维的锻炼,代码是实现你的思路的,当你遗忘的时候,本质是你的思路并不牢固。

举个简单的例子:

求一个三角形边长之和。已知有边长a,b,c。

思路:你知道边长求和是把3个边加一起。

代码就是:

a+b+c

这个实现过程没有任何难度。即使过去了100天,你不记得变量是a,b,c。但是,遇到这样的题目,你还是能做出来。说明什么?说明你的思路是清晰的。

我的老师曾教我,彻底掌握一个题目等于做题海战术100题。

方法就是自己改变题目的变量。

  1. 例子升级1:求一个三角形边长之间最大的差。已知边长a,b,c。

  2. 例子升级2:求一个八角形边长之间最大的差。已知边长a,b,c,...。

  3. 例子升级3:求M个N角形边长之间最大的差。已知边长a,b,c,...。

  4. 例子升级4:求M个N角形边长之间最大的差。已知边长a,b,c,...。

  5. 例子升级5:求M个N角形边长之间最大的差。边长未知。

  6. .....

随着难度的升级,你会发现到了某个阶段,你完全不知道如何下手,毫无思路。这个时候,你可以看高手的题解,或者请教你的朋友。

这个题目,也可以换皮的。在本质不变的情况下,场景可以变为购物优惠计算。每年的淘宝双11,各种优惠活动让人眼花撩乱,如何让大家感觉买的划算,又愿意买更多,背后就是某些人精心的设计。

——吃透一题胜过盲做百题。

学习内容的层级划分

1)先掌握基础的数据结构的概念。

10个数据结构:

数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;

2)会数据结构的基本操作

学会各种数据结构的基本操作,取值、查找、插入、删除等。

3)先掌握基础的算法。

10个算法:

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

4)开始做题。

线性表问题,二叉树问题,图问题等等。

5)学高难度的算法。

图算法,学习联通图、标签传播、PageRank等相关算法。

6)改进数据结构,优化算法

高难度要求。

7)看编译原理,词法分析与语法分析。

学习的书籍推荐

看完这些书,你基本上不存在概念上的问题了。

入门:

  • 《大话数据结构》:(7.9分)

  • 《算法图解》(8.4分)

  • 《图解算法》#入门

  • 《算法帝国》(7.2分)科普类

  • 《我的第一本算法书》

基础:

  • 《数据结构和算法分析》

  • 《算法-红宝书》(第四版)(#强烈推荐)

  • 《算法设计手册》#强烈推荐

  • 《啊哈算法》

高级:

  • 《算法导论》#不推荐新手

  • 《计算机程序设计艺术》#挑战自我

面试:

  • 《剑指 offer》#必看

  • 《编程珠玑》#9分

  • 《编程之美》#面向谷歌、facebook

  • 《Cracking the Coding Interview》

  • 《编程之法:面试和算法心得》

  • 《算法谜题》

刷题网站

刷题还是必不可少的关键。

  • leetcode
  • LintCode
  • 牛客网。

最后

据我观察,算法最大的难度可能不是算法本身,而是学算法的行动力。

看到很多人面对算法的第一感觉,就是算法很难,然后不去学习,但是他们可能碰都没有碰过算法。

所以先行动起来,哪怕你只是注册一个力扣账号,或者买了一本算法书,打开了第一页。当你开始了第一步,后面都是水到渠成的事。

当你刷一个题目,然后完成的时候,那种感觉,就一个字:爽。

可以和一些小伙伴结伴刷题,爽感加倍。

@Zheaoli Zheaoli added the Week1 label Mar 8, 2021
@Zheaoli Zheaoli closed this as completed Mar 8, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants