点击上方蓝色字体,关注程序员zhenguo

你好,我是zhenguo
在讲述程序员必知的40个算法前,我想拿出相当一段篇幅阐述怎样学习算法,以及算法学习切记不能怎么样做。对于每一位程序员或许都有一点用,建议看完并收藏这篇文章。

多久能搞定算法面试题?

我隔三差五的就会收到私信询问这类问题,我的回复一般大概是这样:
算法很有必要学习,建议你制定一个短期计划和长期计划。短期为了应付面试有一套策略,但面试过了,也要长期学习它。
任何事情都有规律性,我们得尊重基本的规律,尊重基本的实事。就像足球得按照规律办事,老想投机取巧,老想急功近利,最后往往是办不好的。
学习算法就像搞足球一样,也得按照规律做事,心急不得!
能做到真正吃透这40个常见的算法,一定是一件非常周期长的事情,也许1年、2年或5年,得有这种心理预期,打持久战的准备。

你或许看过我的一个专栏:60天精通Python技术栈,但我绝不会去写:60天精通40个程序员必知算法:
这是很不负责任的!
会让学习者变得很焦躁,让他们形成一些说大不大、说小不小的感觉:
我他妈的当时都看懂答案了,为啥一到面试就写不出来!是我的记性不好吗?
ai,压根和记性没关系,什么时候学算法也变成背模板、记小抄诸如此类的活动呢?
这是学习算法非常大的误区!
掌握算法,绝不是短时间就能做到的。

我们应该放平心态,我做算法5年有余,看到某些算法书,实话讲,理解也没有太好,依然还得和大家一起学习。

学算法到底要学啥?

从零学算法该怎么做?比如这是一个行之有效的学习算法的路线:
  1. 学习基础算法,比如学习排序算法、搜索算法、贪心算法
  2. 学习非监督机器学习算法,如聚类,数据降维,关联规则挖掘
  3. 学习传统监督算法,如分类和回归
  4. 神经网络相关算法
  5. 推荐、NLP等相关算法
知道这些,依然没有毛用!
还要建立一个更重要的思维意识,学习上面每一个算法时该思考哪些问题:
  1. 这个算法解决了什么问题,它的输入是什么?输出是什么?
  2. 这个算法的时间性能如何?能不能应对高并发或大数据量输入?
  3. 空间性能又如何?
  4. 最好情况是什么?最坏情况是什么?
  5. 这个算法能并行吗?

如何设计1个算法?

接下来,在上面学习了这么多算法后,开始设计算法。先来看看算法设计的目标:
Designing an algorithm is an effort to create a mathematical recipe in the most efficient way that can effectively be used to solve a real-world problem
翻译过来:
设计一个算法就是努力用最高效的方法创造一个数学配方,确保它能有效的求解现实问题。
解决某个问题的算法设计步骤是什么?比如最简单的就拿leetcode上某道题目来说,通常包括:
  1. 首先理解需求。理解待解决的问题,及问题的每一个细节
  2. 设计并确定使用的算法,考虑准确度和时间性能2个维度。
就leetcode上的题目而言,一般都能求出精确解,只考虑优化求解方法即可。但现实世界,鱼和熊掌往往不可兼得,要面临两者选择,比如短时间内求出近似解。
  1. 编码,使用一门语言编程步骤2形成的算法伪代码。
  2. 测试并部署到线上生产环境

程序员必知的40个算法

40 Algorithms Every Programmer Should Know
这是我见过最好的一本算法书:从第一性原理出发,如贪心策略、动规、分治,一直平滑过渡到监督、非监督、NLP,推荐等算法,一共40个程序员必知的算法,全书使用的编程语言是Python,作者是Ahmad博士。
  1. 首先要掌握基础算法,培养算法思维,比如先掌握排序算法、搜索算法、贪心算法
  2. 学习非监督机器学习算法,如聚类,数据降维,关联规则挖掘
  3. 学习传统监督算法,如分类和回归
  4. 神经网络相关算法
  5. 推荐、NLP等相关算法
这本书已放到我的知识星球,自愿加入获取完整PDF,同时我会在星球里继续拆这本书,提问较多的解答也会同步到公众号里。
时间永远都是稀缺的,所以读我选择只读经典。

zhenguo原创精华PDF,倾情奉献给你,后台回复对应关键词下载,给文章点个赞:
继续阅读
阅读原文