怎样系统地学习算法( 三 )


看动画轻松理解时间复杂度(二)
冰与火之歌:「时间」与「空间」复杂度
每个程序员都应该收藏的算法复杂度速查表
2、基本算法思想五分钟了解一下什么是「贪心算法」
有了四步解题法模板,再也不害怕动态规划!
(进阶版)有了四步解题法模板,再也不害怕动态规划!
(再进阶版)有了四步解题法模板,再也不害怕动态规划!
浅谈什么是分治算法
看动画轻松理解「递归」与「动态规划」
浅谈什么是动态规划以及相关的「股票」算法题
深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法「多图警告」手撕排序算法–iOS进阶必备
十大经典排序算法动画与解析,看我就够了!(配代码完全版)
这或许是东半球分析十大排序算法最好的一篇文章
4、搜索几道和「广度优先搜索」有关的算法面试题
初识广度优先搜索与解题套路
从简单二叉树问题重新来看深度优先搜索
5、查找二分查找算法详解
一网打尽!二分查找解题模版与题型全面解析
面试官,我会写二分查找法!对,没有bug的那种!
6、字符串匹配动画:BM算法中的坏字符规则与好后缀规则
动画:七分钟理解什么是KMP算法
动画:什么是BF算法?
动态规划之KMP算法详解(配代码版)
7、线性表如何高效对有序数组/链表去重?
超详细!详解一道高频算法题:数组中的第K个最大元素
一道简单的数组遍历题,加上四个条件后感觉无从下手
数组特性的妙用!如何找到「缺失的第一个正数」
剑指offer第一题:二维数组中的查找
动画:什么是单调栈?
在数据结构中穿针引线:链表实现栈和队列
从简单的线性数据结构开始:栈与队列
五分钟学算法小知识:用栈实现队列/用队列实现栈
几道和「堆栈、队列」有关的面试算法题
超详细!图解「合并K个排序链表」
动画:面试如何轻松手写链表?
LeetCode上最难的链表算法题,没有之一!
链表算法面试问题?看我就够了!
看动画轻松理解「链表」实现「LRU缓存淘汰算法」
从简单的线性数据结构开始:穿针引线的链表(一)
在数据结构中穿针引线:链表实现栈和队列
8、散列表五分钟速读:什么是散列表(哈希表)?
什么是哈希洪水攻击(Hash-FloodingAttack)?
几道和散列(哈希)表有关的面试题
如何判断一个元素在亿级数据中是否存在?
9、树面试前准备:二叉树高频面试题和答案
懵逼树上懵逼果:学习二分搜索树
LeetCode二叉树问题小总结
从简单二叉树问题重新来看深度优先搜索
几道和「二叉树」有关的算法面试题
详解什么是平衡二叉树(AVL)(修订补充版)
【面试现场】为什么MySQL数据库要用B+树存储索引?
字典树概念与题型解析
面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?
心里没点B树。。。
数据结构与算法——最小生成树
植树节,程序猿种的那些树
数据结构与算法——2-3-4树
数据结构与算法——2-3树
看动画轻松理解「Trie树」
10、图浅谈什么是图拓扑排序
数据结构与算法——图论基础与图存储结构
数据结构与算法:三十张图弄懂「图的两种遍历方式」
数据结构与算法——图最短路径
总结学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。
如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。
你的编程内功就真正得到了修炼。大家加油:)

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来个好答案了。
补充再推荐一个阿里朋友的算法刷题的开源项目。
截至2020年11月,该开源项目配套的网站已经有一百二十万的访问量,在GitHub上收获了8500颗小星星。



这个开源项目是@halfrost(中文名一缕殇流化隐半边冰,简称霜神)去年刷算法题时整理出的520题,每道题都写了解题思路,全部都是GO实现的,并且每题都runtimebeats100%了。












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




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


■万丈高楼平地起,要系统学习算法还得从基础开始。
首先学习一门语言。例如C/C++/Java/python,初学者学C++、python比较普遍。学数据结构。数据结构书有很多,但是有些教材晦涩难懂,建议看图解多、通俗易懂的书。学算法。不要一上手就看《算法导论》,大量例子证明会让你崩溃。找本适合初学者快速掌握的算法入门书。接下来,将高级程序员陈小玉老师总结的学习诀窍分享给题主,希望对你有所帮助。
分享人:陈小玉(副教授、高级程序员、畅销书《趣学算法》《趣学数据结构》作者)01为什么要学数据结构?遇到一个实际问题的时候,需要解决两个事情:
(1)如何将数据存储在计算机中;(2)用什么方法策略解决问题。前者是数据结构,后者是算法。
只有数据结构没有算法,相当于只把数据存储到计算机中而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。
数据是一切能输入到计算机的信息的总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有效地存储在计算机中。算法是指对特定问题求解步骤的一种描述,说白了就是解决问题的方法策略。
数据结构和算法不依赖语言,什么语言无所谓。但是如果上机实现的话,就要使用计算机语言。
遇到一个实际问题,充分利用所学的数据结构的知识,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现,这就是N.Wirth教授所说的:
数据结构+算法=程序


计算机专业的本科生都开设数据结构课程,因为它是计算机学科的知识结构核心和技术体系的基石。
研究生考试也是必考科目,随着科学技术的飞速发展,数据结构的基础性地位不仅没有动摇,反而由于近年来算法工程师的高薪火爆,而得到了业内空前的重视。
很多人觉得基本的数据结构及操作已经在高级语言(如C++、JAVA语言中)中封装,栈、队列、排序、优先队列等都可以直接调用库函数,学会怎么调用就好了,干嘛要重复造轮子?
02学习数据结构有什么用处?学习数据有效存储的方法很多学生在学习数据结构时,问我要不要把单链表插入删除代码背下来?要不合上书就不会写了。我非常诧异,为什么要背?理工科技术知识很少需要记忆的,是用的!学习知识不是死记硬背,更重要的是学习处理问题的方法。
同一个问题,如何有效地存储数据,不同的数据结构产生什么样的算法复杂性,有没有更好的存储方法提高算法的效率?
例如,用顺序表查找需要O(n)的时间复杂度,用平衡树查找需要O(logn)的时间复杂度。这是什么概念呢?就像你有10个亿,一觉醒来,兜里只剩下30块!
处理具有复杂关系的数据现实中很多具有复杂关系的数据,无法通过简单的库函数调用实现。专业认证中特别强调培养学生解决复杂工程问题的能力,什么是复杂工程问题?
就是需要综合运用多个知识技术解决的问题。如同现在很多芯片高度集成,完全不需要芯片内部如何,直接使用就行了。


推荐阅读