不 BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了 4 年 !!!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。
这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
如果觉得不错,别忘了双击点个赞哦。
貌似手机端打开连接有的会出现问题,可以点击这个总结看看:五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法www.cxyxiaowu.com
1、复杂度分析
2、基本算法思想
3、排序算法
4、搜索
5、查找
6、字符串匹配
7、线性表
8、散列表
9、树
10、图
总结
学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。
如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。
你的编程内功就真正得到了修炼。
在这里向大家推荐一下我的微信公众号:五分钟学算法(ID:CXYxiaowu),专注算法技术分享,包括算法面试题、数据结构、LeetCode、图解算法、漫画算法等;每天推送优质技术文章,精彩视频教程以及项目源码下载,致力做一个实用的公众号。
2020 年 01 月 13 日补充:
我再推荐一些算法书籍的选择给大家参考一下。
入门系列
入门的同学,我建议你不要过度追求上去就看经典书。
不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。
然后就放弃学算法了。
所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。
不要太在意书写得深浅,重要的是能不能坚持看完。
《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。
虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。
如果你之前完全不懂数据结构和算法,可以先从这本书看起。
《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。
作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。
当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。
所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。
基础系列
通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!
这些书籍需要你费点心思去阅读。
很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。
哎呀,要是文章的代码是 Java 语言就好了呀。
哎呀,要是文章的代码是 Python 语言就好了呀。
虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。
我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。
他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。
面试实战系列
大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。
所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。
《剑指 offer》这本书的目的非常明确,就是为了面试。
这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。
我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。
我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。
图解剑指offer:二维数组的查找_哔哩哔哩 (゜-゜)つロ 干杯~-bilibilib23.tv「双指针」的魅力!图解 LeetCode 第 11 号问题:盛最多水的容器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibilib23.tv
剑指offer精讲图解面试题03. 数组中重复的数字_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
LeetCode 图解 | 739.每日温度_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
《编程珠玑》这本书的豆瓣评分非常高,有 9 分。
这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。
《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。
2020年05月31日补充:数据结构与算法在平时工作中的作用。
正如 N.Wirth 教授所说的: 数据结构+ 算法=程序。
遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现。
这句话可能有点抽象,我举个例子给你们解释一下。
在工作过程中,我们多多少少都接触过 OAuth2 ,在使用 OAuth2 授权的时候,通常应用会弹出一个类似这样的信息:
1) 获取用户基本信息接口
2) 获取用户列表接口
3) 用户分组管理接口
。。。微信获取授权
思考一下,如果让你设计数据库,应该怎么设计信息存储权限?
如何你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限。
我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:获取你的头像、性别、昵称等基本用户信息
以你的身份发布微博
获取你的好友列表
获取你的朋友圈信息
每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。
例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。
数据结构的实际作用还有挺多,感兴趣的可以搜索以下知识点:红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
Radix树,用于内存管理、NFS相关查找和网络相关的功能
......
上面这些例子是关于数据结构的,我再举一个算法的例子,如果有帮助,不妨点个赞收藏一下,好的内容值得肯定。
同样的也来思考一个问题:计算机的缓存容量无论再大,缓存满了还是要删除一些内容,给新内容腾位置。
那么删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?
这个时候采取的策略就是 LRU 缓存淘汰算法。
LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。
具体的关于 LRU 缓存淘汰算法 的介绍可以看我之前写的一篇文章。
补充
再推荐一个阿里朋友的算法刷题的开源项目。
截至 2020 年 11 月,该开源项目配套的网站已经有一百二十万的访问量,在 GitHub 上收获了 8500 颗小星星。
这个开源项目是@halfrost(中文名一缕殇流化隐半边冰,简称霜神)去年刷算法题时整理出的 520 题,每道题都写了解题思路,全部都是 GO 实现的,并且每题都 runtime beats 100% 了。
至于为什么要求每题都 runtime beats 100%。
霜神是这样回复的:优化到 beats 100% 才算是把这题做出感觉了。有好几道 Hard 题,可以用暴力解法 AC 了,但只 beats 了 5%,这题就如同没做一样;而且面试中如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解,面试官会更满意一些。
如果你把这些题解都摸透,相信在面试环节你可以从容的回答“还有没有更优解”。
作者介绍:霜神是前阿里巴巴资深后端工程师,业余时间酷爱写博客,目前他的博客已经有 300W+ 的浏览量,是 iOS 开发届的大佬级别人物,霜神为人谦和,上周六我说能不能提供一份离线电子书,方便读者阅读,他立马熬夜研究,修改了好几个版本。
我的专栏:和程序员小吴一起学算法zhuanlan.zhihu.com
我的其它高赞回答:程序员必须掌握哪些算法?www.zhihu.com字节跳动面试难吗,应该如何应对?www.zhihu.com
大家都是如何刷 LeetCode 的?www.zhihu.com
算法网站推荐?www.zhihu.com