找回密码
 立即注册
楼主: RedZero9

如何系统地学习算法?

[复制链接]
发表于 2021-7-4 10:11 | 显示全部楼层
不 BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了 4 年 !!!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。


这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
知乎小技巧:看到一个好答案,想点赞又嫌麻烦,可以双击屏幕自动点,既能鼓舞作者,又能很方便自己下次再看。我用这个方法,已经快速标记 10 来个好答案了。
貌似手机端打开连接有的会出现问题,可以点击这个总结看看:
五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法1、复杂度分析

看动画轻松理解时间复杂度(一)
看动画轻松理解时间复杂度(二)
冰与火之歌:「时间」与「空间」复杂度
每个程序员都应该收藏的算法复杂度速查表
2、基本算法思想

五分钟了解一下什么是「贪心算法 」
有了四步解题法模板,再也不害怕动态规划!
(进阶版)有了四步解题法模板,再也不害怕动态规划!
(再进阶版)有了四步解题法模板,再也不害怕动态规划!
浅谈什么是分治算法
看动画轻松理解「递归」与「动态规划」
浅谈什么是动态规划以及相关的「股票」算法题
深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法

「多图警告」手撕排序算法 – iOS进阶必备
十大经典排序算法动画与解析,看我就够了!(配代码完全版)
这或许是东半球分析十大排序算法最好的一篇文章
4、搜索

几道和「广度优先搜索」有关的算法面试题
初识广度优先搜索与解题套路
从简单二叉树问题重新来看深度优先搜索
5、查找

二分查找算法详解
一网打尽!二分查找解题模版与题型全面解析
面试官,我会写二分查找法!对,没有 bug 的那种!
6、字符串匹配

动画:BM 算法中的坏字符规则与好后缀规则
动画:七分钟理解什么是KMP算法
动画:什么是 BF 算法 ?
动态规划之 KMP 算法详解(配代码版)
7、线性表

如何高效对有序数组/链表去重?
超详细!详解一道高频算法题:数组中的第 K 个最大元素
一道简单的数组遍历题,加上四个条件后感觉无从下手
数组特性的妙用!如何找到「缺失的第一个正数」
剑指 offer 第一题:二维数组中的查找
动画:什么是单调栈?
在数据结构中穿针引线:链表实现栈和队列
从简单的线性数据结构开始:栈与队列
五分钟学算法小知识:用栈实现队列/用队列实现栈
几道和「堆栈、队列」有关的面试算法题
超详细!图解「合并 K 个排序链表」
动画:面试如何轻松手写链表?
LeetCode 上最难的链表算法题,没有之一!
链表算法面试问题?看我就够了!
看动画轻松理解「链表」实现「LRU缓存淘汰算法」
从简单的线性数据结构开始:穿针引线的链表(一)
在数据结构中穿针引线:链表实现栈和队列
8、散列表

五分钟速读:什么是散列表(哈希表)?
什么是哈希洪水攻击(Hash-Flooding Attack)?
几道和散列(哈希)表有关的面试题
如何判断一个元素在亿级数据中是否存在?
9、树

面试前准备:二叉树高频面试题和答案
懵逼树上懵逼果:学习二分搜索树
LeetCode 二叉树问题小总结
从简单二叉树问题重新来看深度优先搜索
几道和「二叉树」有关的算法面试题
详解什么是平衡二叉树(AVL)(修订补充版)
【面试现场】为什么 MySQL 数据库要用B+树存储索引?
字典树概念与题型解析
面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?
心里没点 B 树。。。
数据结构与算法——最小生成树
植树节,程序猿种的那些树
数据结构与算法——2-3-4树
数据结构与算法——2-3树
看动画轻松理解「Trie树」
10、图

浅谈什么是图拓扑排序
数据结构与算法——图论基础与图存储结构
数据结构与算法:三十张图弄懂「图的两种遍历方式」
数据结构与算法——图最短路径
总结

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。
如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。
你的编程内功就真正得到了修炼。大家加油:)


<hr/>2020 年 01 月 13 日补充,推荐一些算法书籍的选择。
入门系列

入门的同学,我建议你不要过度追求上去就看经典书。
不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。
然后就放弃学算法了。
所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。
不要太在意书写得深浅,重要的是能不能坚持看完。
《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。
虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。
如果你之前完全不懂数据结构和算法,可以先从这本书看起。
《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。
作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。
当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。
所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。
基础系列

通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!
这些书籍需要你费点心思去阅读。
很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。
哎呀,要是文章的代码是 Java 语言就好了呀。
哎呀,要是文章的代码是 Python 语言就好了呀。
虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。
我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。
他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。
面试实战系列

大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。
所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。
《剑指 offer》这本书的目的非常明确,就是为了面试。
这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。
我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。
我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。


图解剑指offer:二维数组的查找_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili「双指针」的魅力!图解 LeetCode 第 11 号问题:盛最多水的容器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

《编程珠玑》这本书的豆瓣评分非常高,有 9 分。
这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。
《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。
最后:大家加油:)
看到一个好答案,想收藏又嫌麻烦,可以双击屏幕自动点,既能鼓舞作者,又能很方便自己下次再看。我用这个方法,已经快速标记 10 来个好答案了。
<hr/>补充

再推荐一个阿里朋友的算法刷题的开源项目。
截至 2020 年 11 月,该开源项目配套的网站已经有一百二十万的访问量,在 GitHub 上收获了 8500 颗小星星。
这个开源项目是@halfrost(中文名一缕殇流化隐半边冰,简称霜神)去年刷算法题时整理出的 520 题,每道题都写了解题思路,全部都是 GO 实现的,并且每题都 runtime beats 100% 了。






至于为什么要求每题都 runtime beats 100%。  
霜神是这样回复的:优化到 beats 100% 才算是把这题做出感觉了。有好几道 Hard 题,可以用暴力解法 AC 了,但只 beats 了 5%,这题就如同没做一样;而且面试中如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解,面试官会更满意一些。
如果你把这些题解都摸透,相信在面试环节你可以从容的回答“还有没有更优解”。


作者介绍:霜神是前阿里巴巴资深后端工程师,业余时间酷爱写博客,目前他的博客已经有 300W+ 的浏览量,是 iOS 开发届的大佬级别人物,霜神为人谦和,上周六我说能不能提供一份离线电子书,方便读者阅读,他立马熬夜研究,修改了好几个版本。
离线版笔记下载地址(已获授权)链接: https://pan.baidu.com/s/1G7Lc6593SfM7PTuw3ao4QQ  密码: urn0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 10:15 | 显示全部楼层
谢邀。对于这个问题,我也不太有发言权,只能根据自己的体会瞎说一下。不清楚lz的具体水平,所以中间提供了一些可供测试的内容。

1、可以先不看任何书籍,自己试着解决一些简单问题。或是与他人讨论问题。
2、等你习惯了使用位图、hash、优先队列来解决问题(这部分知识用到时从网上能搜索到)。可以开始学习动态规划和分治。
3、如果你对递推已有所了解,并会运用到状态转移方程中。同时可以解决这里面的大部分问题:http://www.51nod.com/favorite/index.html#!favoriteId=25。
那么你可以开始看《算法导论》了。
4、算法导论的内容不需要通读,找自己懂的部分仔细看看,图论部分可以先略过。习题如有不懂无须深究,以后慢慢体会。最好将注意力集中在《算法导论》的问题上,不要被其他问题分散了精力。
5、第1次看过导论之后,需要将学到的知识,以及分析问题的方法总结并灵活运用。这时你应当可以解决这里面的大部分问题。
http://www.51nod.com/favorite/index.html#!favoriteId=36
http://www.51nod.com/favorite/index.html#!favoriteId=26
6、到各个OJ挑一些水题做,同时别忘了同大家讨论,讨论是加深记忆的捷径。经过这段后,你应当可以轻松的解决这里面的大部分问题。
http://www.51nod.com/favorite/index.html#!favoriteId=33
http://www.51nod.com/favorite/index.html#!favoriteId=27
如果《算法导论》算是教材的话,你目前虽未完全掌握教材中的内容,但应该已经了解了不少超纲的内容。
7、第2次看《算法导论》,这次除了线性规划和近似算法可以跳过,剩下的知识点都要涉及。哪怕细节存疑,先掌握哪些问题用哪些方法解决。之后可以试着解决一下这些问题:
http://www.51nod.com/favorite/index.html#!favoriteId=34
http://www.51nod.com/favorite/index.html#!favoriteId=28

到此知识的基础构架应当完备了,但各种模型转换以及思想的运用,还要靠长期的积累学习。
发表于 2021-7-4 10:17 | 显示全部楼层
我知道这个问题被问出来的初衷,是要获得一套《九阴真经》,看完这套《九阴真经》,照着这套《九阴真经》练,就大功告成了——其实完全不是那么回事。
请按照下列步骤学习算法:
    确定自己的目标:你是为了考试拿高分学习算法,还是为了找工作面试学习算法,还是纯粹为了学习算法而学习算法?确定自己目前的级别:啥也不会,和已经受过计算机专业教育是完全不同的起点,方法当然不对,可以理解吧。更具上面两点,寻找恰当的书籍……(划掉这一条,这一条根本行不通)找任何一个知名大学的计算机本科算法和数据结构教材,看懂它,学完它,如果你已经学过了,跳到5这时候你知道了怎么回答1和2的问题,你应该可以有一个自己的『工作』了,这个『工作』可能是程序员的工作,也可能是一个科研工作,反正你有正事了。根据自己的正事需求,来学习相关的算法。忘记这世界上有《九阴真经》的幻想。
就这样,谢谢。
发表于 2021-7-4 10:25 | 显示全部楼层
不 BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了 4 年 !!!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。


这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
如果觉得不错,别忘了双击点个赞哦。
另外,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!




貌似手机端打开连接有的会出现问题,可以点击这个总结看看:
五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法1、复杂度分析

看动画轻松理解时间复杂度(一)
看动画轻松理解时间复杂度(二)
冰与火之歌:「时间」与「空间」复杂度
每个程序员都应该收藏的算法复杂度速查表
2、基本算法思想

五分钟了解一下什么是「贪心算法 」
有了四步解题法模板,再也不害怕动态规划!
(进阶版)有了四步解题法模板,再也不害怕动态规划!
(再进阶版)有了四步解题法模板,再也不害怕动态规划!
浅谈什么是分治算法
看动画轻松理解「递归」与「动态规划」
浅谈什么是动态规划以及相关的「股票」算法题
深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法

「多图警告」手撕排序算法 – iOS进阶必备
十大经典排序算法动画与解析,看我就够了!(配代码完全版)
这或许是东半球分析十大排序算法最好的一篇文章
4、搜索

几道和「广度优先搜索」有关的算法面试题
初识广度优先搜索与解题套路
从简单二叉树问题重新来看深度优先搜索
5、查找

二分查找算法详解
一网打尽!二分查找解题模版与题型全面解析
面试官,我会写二分查找法!对,没有 bug 的那种!
6、字符串匹配

动画:BM 算法中的坏字符规则与好后缀规则
动画:七分钟理解什么是KMP算法
动画:什么是 BF 算法 ?
动态规划之 KMP 算法详解(配代码版)
7、线性表

如何高效对有序数组/链表去重?
超详细!详解一道高频算法题:数组中的第 K 个最大元素
一道简单的数组遍历题,加上四个条件后感觉无从下手
数组特性的妙用!如何找到「缺失的第一个正数」
剑指 offer 第一题:二维数组中的查找
动画:什么是单调栈?
在数据结构中穿针引线:链表实现栈和队列
从简单的线性数据结构开始:栈与队列
五分钟学算法小知识:用栈实现队列/用队列实现栈
几道和「堆栈、队列」有关的面试算法题
超详细!图解「合并 K 个排序链表」
动画:面试如何轻松手写链表?
LeetCode 上最难的链表算法题,没有之一!
链表算法面试问题?看我就够了!
看动画轻松理解「链表」实现「LRU缓存淘汰算法」
从简单的线性数据结构开始:穿针引线的链表(一)
在数据结构中穿针引线:链表实现栈和队列
8、散列表

五分钟速读:什么是散列表(哈希表)?
什么是哈希洪水攻击(Hash-Flooding Attack)?
几道和散列(哈希)表有关的面试题
如何判断一个元素在亿级数据中是否存在?
9、树

面试前准备:二叉树高频面试题和答案
懵逼树上懵逼果:学习二分搜索树
LeetCode 二叉树问题小总结
从简单二叉树问题重新来看深度优先搜索
几道和「二叉树」有关的算法面试题
详解什么是平衡二叉树(AVL)(修订补充版)
【面试现场】为什么 MySQL 数据库要用B+树存储索引?
字典树概念与题型解析
面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?
心里没点 B 树。。。
数据结构与算法——最小生成树
植树节,程序猿种的那些树
数据结构与算法——2-3-4树
数据结构与算法——2-3树
看动画轻松理解「Trie树」
10、图

浅谈什么是图拓扑排序
数据结构与算法——图论基础与图存储结构
数据结构与算法:三十张图弄懂「图的两种遍历方式」
数据结构与算法——图最短路径
总结

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。
如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。
你的编程内功就真正得到了修炼。大家加油:)
我在B站学算法:
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili强烈推荐:
GitHubPlus:卧槽!LeetCode 电子书开放下载了!补充

推荐一个阿里朋友的算法刷题的开源项目。
截至 2020 年 11 月,该开源项目配套的网站已经有一百二十万的访问量,在 GitHub 上收获了 8500 颗小星星。
这个开源项目是@halfrost(中文名一缕殇流化隐半边冰,简称霜神)去年刷算法题时整理出的 520 题,每道题都写了解题思路,全部都是 GO 实现的,并且每题都 runtime beats 100% 了。






至于为什么要求每题都 runtime beats 100%
霜神是这样回复的:优化到 beats 100% 才算是把这题做出感觉了。有好几道 Hard 题,可以用暴力解法 AC 了,但只 beats 了 5%,这题就如同没做一样;而且面试中如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解,面试官会更满意一些。
如果你把这些题解都摸透,相信在面试环节你可以从容的回答“还有没有更优解”。


作者介绍:霜神是前阿里巴巴资深后端工程师,业余时间酷爱写博客,目前他的博客已经有 300W+ 的浏览量,是 iOS 开发届的大佬级别人物,霜神为人谦和,上周六我说能不能提供一份离线电子书,方便读者阅读,他立马熬夜研究,修改了好几个版本。
需要刷题笔记 PDF 文档的小伙伴可以直接点击下方链接下载(已获作者授权):
离线版笔记下载地址(已获授权)链接: https://pan.baidu.com/s/1prMLkrf7MqANVyrqZjzPhw 密码: gjht
离线版笔记下载地址(已获授权): LeetCode - Go 电子书下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 10:33 | 显示全部楼层
这里的内容是我学习算法过程的一些记录,希望能一直坚持下去。
学习方法

    把所有经典算法写一遍看算法有关源码加入算法学习社区,相互鼓励学习看经典书籍刷题
<hr/>基本数据结构和算法

这些算法全部自己敲一遍:
链表

    链表双向链表
哈希表/散列表 (Hash Table)

    散列函数碰撞解决
字符串算法

    排序查找BF算法KMP算法BM算法正则表达式数据压缩
二叉树

    二叉树二叉查找树伸展树(splay tree 分裂树)平衡二叉树AVL红黑树B树,B+,B*R树Trie树(前缀树)后缀树最优二叉树(赫夫曼树)二叉堆 (大根堆,小根堆)二项树二项堆斐波那契堆(Fibonacci Heap)
图的算法

    图的存储结构和基本操作(建立,遍历,删除节点,添加节点)最小生成树拓扑排序关键路径最短路径: Floyd,Dijkstra,bellman-ford,spfa
排序算法

交换排序算法
    冒泡排序插入排序选择排序希尔排序快排归并排序堆排序
线性排序算法
    桶排序
查找算法

    顺序表查找:顺序查找有序表查找:二分查找分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到块中顺序查找动态查找: 二叉排序树,AVL树,B- ,B+ (这里之所以叫 动态查找表,是因为表结构是查找的过程中动态生成的)哈希表: O(1)
15个经典基础算法

    Hash快速排序快递选择SELECTBFS/DFS (广度/深度优先遍历)红黑树 (一种自平衡的二叉查找树)KMP 字符串匹配算法DP (动态规划 dynamic programming)A*寻路算法: 求解最短路径Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)遗传算法启发式搜索图像特征提取之SIFT算法傅立叶变换SPFA(shortest path faster algorithm) 单元最短路径算法
<hr/>海量数据处理

    Hash映射/分而治之BitmapBloom filter(布隆过滤器)Trie树数据库索引倒排索引(Inverted Index)双层桶划分外排序simhash算法分布处理之Mapreduce
<hr/>算法设计思想

    迭代法穷举搜索法递推法动态规划贪心算法回溯分治算法
<hr/>算法问题选编

这是一个算法题目合集,题目是我从网络和书籍之中整理而来,部分题目已经做了思路整理。问题分类包括:
    字符串堆和栈链表数值问题数组和数列问题矩阵问题二叉树图海量数据处理智力思维训练系统设计
还有部分来自算法网站和书籍:
    九度OJleetcode剑指offer
<hr/>开源项目中的算法

    YYCachecocos2d-objc...
<hr/>推荐阅读

刷题必备

《剑指offer》
《编程之美》
《编程之法:面试和算法心得》   《算法谜题》 都是思维题
基础

《编程珠玑》Programming Pearls
《编程珠玑(续)》
《数据结构与算法分析》
《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致
算法设计

《算法设计与分析基础》
《算法引论》 告诉你如何创造算法 断货
《Algorithm Design Manual》算法设计手册 红皮书
《算法导论》 是一本对算法介绍比较全面的经典书籍
《Algorithms on Strings,Trees and Sequences》
《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块
延伸阅读

《深入理解计算机系统》
《TCP/IP详解三卷》
《UNIX网络编程二卷》
《UNIX环境高级编程:第2版》
《The practice of programming》 Brian Kernighan和Rob Pike
《writing efficient programs》 优化
《The science of programming》 证明代码段的正确性 800块一本
内容来自:算法学习笔记,作者:nonstriater
算法虐我千百遍,我待算法如初恋
发表于 2021-7-4 10:42 | 显示全部楼层
作为一个算法和数据结构的布道者,我一直致力于用最浅显易懂的方式,为大家分享数据结构的各种知识,希望大家能够真正理解数据结构,喜欢上数据结构。
首先自我介绍一下:
我是小灰,微信公众号【程序员小灰】的运营者,这是算法和数据结构领域的第一大公众号。
同时,我也是技术图书《漫画算法》的作者,在2019年上半年,《漫画算法》被评为京东最畅销的科技类新书。
许多程序员对算法和数据结构望而生畏,认为这是一项高深莫测的学问。
以前我曾经面试过一个小伙伴,起初考察他的技术功底和项目经验,他都回答得还不错。接下来我对他说:“OK,那我考察一下你的算法和数据结构水平吧。”
题目还没说出口,小伙伴立马摆摆手说:“不要不要,我算法不行的!”
我还是有些不甘心,接着说道:“我只考察最最基础的,你说说冒泡排序的基本思路吧?”
小伙伴仍旧说:“我不知道,我算法一点都不会.....”.
算法和数据结构真的有那么难,真的有那么无趣吗?
恰恰相反,算法是编程领域最有意思的一块内容,也并没有许多人想象的那样难以驾驭。
许多人把算法比作是程序员的“内功”,但小灰觉得这个比喻并不是很恰当。内功实实在在,没有任何巧妙可言,而算法天马行空,千变万化,就像是金庸笔下令狐冲的一套独孤九剑。
学习算法,我们不需要去死记硬背那些个冗长复杂的背景知识、底层原理、指令语法......我们所需要的只有对算法思想的领悟、对空间和性能的理解、开动脑筋去寻求最佳的解决方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。
我一直希望写出一些东西,让更多的IT同行们能够领略到算法的魅力,可是用什么方式来写呢?
2016年9月,一次突如其来的灵感,让我创造了一个初出茅庐的菜鸟程序员形象,这个菜鸟程序员名叫小灰。
程序员小灰的故事活跃在微信公众号上,用漫画的形式诉说着他的一次又一次面试经历,倔强的小灰屡战屡败,屡败屡战。小灰是我本人刚刚入行时的真实写照,相信许多程序员小伙伴们也能从中看到自己的影子。
以下是几篇具有代表性的漫画:
漫画:什么是冒泡排序?漫画:什么是插入排序?漫画:什么是希尔排序?漫画:什么是归并排序?漫画:什么是 “图”?(修订版)漫画:什么是红黑树?漫画:什么是B-树?漫画:什么是跳跃表?漫画:什么是动态规划?(整合版)漫画:什么是八皇后问题?漫画:什么是LRU算法?今后,小灰还会努力创作更多更精彩的作品,让数据结构和算法不再枯燥乏味!
如果你觉得这个回答对你有用,希望帮忙点个赞,让更多的朋友看到它。
也欢迎关注公众号 【程序员小灰】,里面有更多精彩的内容等着你。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 10:45 | 显示全部楼层
楼上前辈少说了我认为很重要一个前提,那就是离散。既说『系统』,要深究,就不是用用而已,你要对比哪个算法好,就需要计算算法的效率,复杂度和离散数学关系紧密,所以先学好离散。实际上所有的算法书在介绍某个算法的时候都只是在计算它的复杂度,离散不好算法就学不好,死记硬背几个经典算法那当然不叫系统了。这个学好不一定精通,入门即可,毕竟你不是去搞应用数学。

觉得离散学好了就可以看算法了,当然并不是看懂了就不用记了,经典算法还是要记,要领和很多计算机本领的练习一样,就是用你会的各种语言去写,又练算法又练代码,两不落下,还可以结合算法数据结构应用密集的项目学习,比如redis.

如果你在学校,老师教的不见得好,但差不多是够『系统』的,跟好老师和教材。如果你没在学校,推荐两本书,《A First Course in Discrete Mathematics - Ian Anderson》如题目所说,就是入门,没有难度,学过初等数学就能看了,很薄一本,但是学完看算法书差不多够了,清华有引进版。算法书就是《算法导论》啦。
跟着MOOC学也不错,最好的自然是MIT的Introduction to Algorithms,网易公开课和iTunesU都有,配合算法导论,再好不过。

不好意思没有捷径介绍给你,一些不权威的个人经验,祝你精进吧。
发表于 2021-7-4 10:55 | 显示全部楼层
我的建议是,不要一上来就啃《算法导论》这种大部头,包括《算法》这本书。
针对没有任何基础的小白,我觉得从一门网课开始,了解一些最最基础的算法,比如冒泡排序,插入排序等。然后了解一下递归,能用递归解决一些简单的问题。之后还有栈、队列这两个重要的数据结构。有了这样的基础,就能去写写走迷宫,八皇后这样的题目,深度优先,广度优先也是依赖于栈和队列的。再往后就有树,图,堆等等,网课我比较推荐邓俊辉的MOOC(配套书籍是《数据结构 C++版》邓俊辉著)。
【全】清华大学-邓俊辉MOOC数据结构与算法全套再说说为什么是网课吧,网课好处在于,遇到没怎么听懂的地方,可以倒回去多看几遍。而且网课可以自己把握进度。有人会说看看书不也一样吗?确实,如果理解能力强,看书就足够了,但对于更多的人来说,需要视频来展现出算法的执行流程,方便理解。邓老师的网课在这方面做的就很好,基本所有的算法都会有动态的演示。
有个美中不足的地方,邓老师的网课用的是 C++ ,大部分初学者可能只会一点 C 语言,一上来可能会有点水土不服。
还有一点要提一下,在看网课的时候,适当刷刷算法题。一开始就从新手难度开始,关于 OJ ,我推荐洛谷:
试炼场 - 洛谷这是训练场的一些截图,可以看到有很多知识点都是在网课里能学到的,在洛谷巩固一下是个不错的选择。


除此之外,刷题 AC 后的成就感能反过来激发学习的兴趣,学到新算法能够 AC 更多题,形成一个正反馈。
很多人半途而废就是因为缺少激励,所以,动手敲代码吧!
个人认为这才是「入门」的一个正确途径。那些建议初学者硬啃《算法导论》的答主,可能自己也没看完(巨佬除外)。


入门阶段结束,就可以看《算法》这本书了。
为什么推荐这本呢?因为这本书图片非常多,很有助于对算法的理解。
还是上图:
可以说是很良心了。
不过这本书里也牵扯到许多算法的证明过程,不感兴趣可以跳过。
看这本书的时候也不要停下刷题的步伐,洛谷的提高题,以及 leetcode 平台上的分类题库都是不错的选择。(想找工作的话,leetcode 可以说是必刷了)
还有要说明的一点:如果看书有不明白的地方,完全可以上网查资料B站上也有很多视频教程可以看,不要局限于书本。
如果看完这本书还不满足,《算法导论》、《计算机程序设计艺术》欢迎你~
<hr/>如果本文对你有帮助,欢迎关注我的公众号 tobe的呓语 ,带你深入计算机的世界~  公众号后台回复关键词【计算机】可获得我精选的技术书籍,内容覆盖 python、java、SQL、Docker、操作系统、算法、计算机网络等,而且均为文字版哦~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 10:58 | 显示全部楼层
推介一下我自己的算法课,因为疫情的原因,有了直播授课和视频回放,都在B站:
    疫情期间在线授课信息:https://zhuanlan.zhihu.com/p/106049035B站空间:https://space.bilibili.com/474662253教材相关信息:https://zhuanlan.zhihu.com/p/24150569
有几个大家一般很关注的点说明一下:
    我们的课程对于“速成”、“迅速码出代码搞定面试”等目标,是不合适的。如果动手能力不错,并且对代码背后的原理感兴趣,可能会有一些帮助。我们对于算法的理解和定位,精神实质上更接近离散数学。课程中的“算法设计与分析”本质上是当作一种“数学对象”来处理的,与数据结构、具体的编程语言等经常跟算法一起辨析的概念不在一个维度上。
发表于 2021-7-4 11:08 | 显示全部楼层
先给大家上一张图!!
上面把程序员需要掌握的数据结构和算法都罗列出了:
如果是初学者的话,按照下面这个路线去学习算法准没错:

1、数据结构

数据结构研究的内容就是如何按一定的逻辑结构,把数据组织起来,一般学习算法都是先从数据结构开始学习,先根据实际问题确定数据结构,然后在数据结构的基础上进行算法设计。
常见的数据结构有:
    栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。队列(Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。数组(Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。图(Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。散列表(Hash table):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。
2、常用基础算法

常用的基础算法包括:分治算法、贪心算法、动态规划算法、二分查找算法和分支界限算法等,下面列举每个算法的详细教程:
五大常用算法之:分治算法
五大常用算法之:贪心算法
五大常用算法之:动态规划算法
五大常用算法之:二分查找算法
五大常用算法之:分支限界法
3、排序算法

排序算法最经典的莫过于八大排序算法了,分别是:插入排序、冒泡排序、选择排序、希尔排序、堆排序、归并排序、快速排序、桶式排序。
排序算法很重要,考试和面试都会考察,而且是必考,我把八大排序算法的原理和代码都整理出来了,看下面这篇文章就够:
谭庆波:八大经典排序算法详解4、搜索算法

搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题解的一种方法。 现阶段常用的搜索算法有:枚举算法、深度优先搜索、广度优先搜索、剪枝算法、回溯算法等,以下是详细教程:
搜索算法之:枚举算法
DFS(深度优先搜索)和BFS(广度优先搜索)
搜索算法之:剪枝算法
搜索算法之:回溯算法
5、树与图

树与图相关是知识还是挺多的,而且很重要,想全面了解可以看书,推荐看《图解算法》,后面有下载链接。下面也整理了一些相关文章:
数据结构与算法——图最短路径
数据结构与算法:三十张图弄懂「图的两种遍历方式」
数据结构与算法——最小生成树
几道和「二叉树」有关的算法面试题
关键路径算法详解
大话数据结构-多路查找树(B树)_小地盘的诺克萨斯-CSDN博客_多路查找树


6、优秀的算法书

每个人的算法基础都不一样,每一本《数据结构与算法》书籍的侧重点也都是不同的,“哪一本《数据结构与算法》书最好?”这个问题不太好回答,但是从入门开始学起准没错。
我把算法分成了三个阶段:入门、面试、进阶。每个阶段都推荐了几本特别经典的书,大家按照自己的实际情况查漏补缺。
一、入门级别

1、《我的第一本算法书》

这本书是京都大学一个计算机教授和朋友联合出品的动画讲解算法的App 所衍生出来的书籍,非常适合新手朋友们。里面没有枯燥的理论和复杂的公式,而是通过大量的步骤图帮助读者加深对数据结构原理和算法执行过程的理解,便于学习和记忆。将本书作为算法入门的第一步,是非常不错的选择。

2、《趣学算法》

本书从算法之美娓娓道来,没有高深的原理,也没有枯燥的公式,通过趣味故事引出算法问题,包含50多个实例及完美图解,结合学生提问,分析算法本质,并给出代码实现的详细过程和运行结果。本书可作为程序员的学习用书,也适合从未有过编程经验但又对算法有强烈兴趣的初学者使用,同时也可作为高等院校计算机、数学及相关专业的师生用书和培训学校的教材。

3、《啊哈!算法》

《啊哈!算法》一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。其中涉及的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及的算法有排序、枚举、深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、割点与割边算法、二分图的最大匹配算法等。

4、《图解算法》

这是一本像小说一样有趣的算法入门书,示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的篇幅将主要介绍应用广泛的算法。

二、算法面试必备

1、《剑指offer》

这本书大家一定如雷贯耳吧,基本上只要你是程序员就一定会用到这本书,书里面剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点,是程序员找工作必备的一本算法书。

2、《编程珠玑》

这本书精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。



3、《编程之美》

这本书收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试、面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。

三、算法进阶

1、《算法》(第4版)
本书是以哈尔滨工业大学国家精品课程“数据结构与算法”为基础,融入数据结构与算法的最新研究成果编写而成。为普通高等教育“十一五”国家级规划教材,经典中的经典算法书!

2、《算法导论

这本书真的称得上是算法领域的“圣书”了,如果把它从头到尾看完并且搞明白了,那么恭喜你,年入百万不是梦!

    链接:<a href="http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1Y1kXAyQsZO3MA_kgfa5Jog" class=" external" target="_blank" rel="nofollow noreferrer">https://pan.baidu.com/s/1Y1kXAyQsZO3MA_kgfa5Jog提取码:tl3x
最后

学习算法的过程,是非常好的训练机器程序思维的过程,所以,千万不要被动地记忆,要多辩证地思考,而且一定一定要在看懂之后自己用自己喜欢的编程语言实现一遍,一定要亲自实现一遍呀!!!这一点太重要了。
如果你一直这么坚持做,你会发现,你的编程水平会越来越高,写的代码会越来越艺术,你会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数也就会越来越少。
加油!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 04:21 , Processed in 0.199911 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表