如何学好数据结构?

大家好,我是程序员吴师兄。

最近在公众号发布了不少图解 LeetCode 的文章,一些同学在后台打卡,甚是感动,以后也会每天都发布一篇,希望能帮助大家更好的刷题,通过算法面试,进入心仪的大厂。

谈到刷题,还是有一些小技巧的:

  • 1、按算法分类来选题,这种做法可以极大的提高刷题的速度,而且能带来更好的效果
  • 2、刷题的过程中先看懂题目、再分析推导解法、最后转换为代码

当然,这些技巧的前提是你得掌握了基础的数据结构和算法

很多人学算法要么是拿起《算法 4》来啃,结果倒在第二章,要么在网上找一些零散的博客看,导致无法建立一个完整的系统框架,过段时间都忘了,怀疑自己智商不够。

事实上,算法不是纯粹拼智商的,它是可以通过科学合理的方式训练出来的能力,刷题蛮干是不行的,需要遵循科学的方法,算法训练是个系统工程,得循序渐进着来,过于急功近利,反而会因做不出题而产生挫败感,带来反作用。

这两年来,每次有读者问我学数据结构和算法有什么好的图文课程,我都会推荐王争的《数据结构与算法之美》,毫不夸张的说,这是市面上最实用又全面的算法教程,口碑特别好(10W+的订阅量与评论区的大量好评),目前已经安利了 600 人去看,看完后基本上都不害怕刷题了。


如何学好数据结构?_第1张图片


运营小姐姐说过几天要涨价了,所以想趁着还有优惠,再次推荐给小伙伴们

数据结构与算法之美_算法实战_算法面试-极客时间

如果你在准备春招,建议把这个专栏刷一遍,这样数据结构基本没啥问题了,然后再按算法分类进行系统的刷题,那么在算法面试环节和面试官谈笑风生不成问题,聊一聊如何根据年龄给 100 万用户数据排序如何快速定位 IP 对应的省份地址如何防止数据库中的用户信息呗脱库

再和大家聊一聊数据结构与算法在平时工作中的作用,毕竟很多人不想学就是不知道学它有啥用,业务工作中貌似又用不到。

举个例子,在工作过程中,我们多多少少都接触过 OAuth2 ,在使用 OAuth2 授权的时候,通常应用会弹出一个类似这样的信息:

  • 1) 获取用户基本信息接口
  • 2) 获取用户列表接口
  • 3) 用户分组管理接口


如何学好数据结构?_第2张图片


思考一下,如果让你设计数据库,应该怎么设计信息存储权限

如果你不会数据结构的话,肯定是 if/else 组合各种 API 写一堆臃肿的代码。

而如果你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限。

我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:

  • 获取你的头像、性别、昵称等基本用户信息
  • 以你的身份发布微博
  • 获取你的好友列表
  • 获取你的朋友圈信息

每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。

例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。

数据结构的实际作用还有挺多,感兴趣的可以搜索以下知识点:

  • 二叉树搜索用于中断处理、登记缓存查找等 哈希表,用于实现索引节点、文件系统完整性检查等
  • 红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
  • Radix树,用于内存管理、NFS相关查找和网络相关的功能

上面这些例子是关于数据结构的,我再举一个算法的例子,同样的也来思考一个问题:计算机的缓存容量无论再大,缓存满了还是要删除一些内容,给新内容腾位置。

删除哪些内容呢

我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。

那么,什么样的数据,我们判定为「有用的」的数据呢?

这个时候采取的策略就是 LRU 缓存淘汰算法。

LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

很多时候判断程序员是不是编程高手,往往就是看这些细节:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。

如果你还不懂数据结构和算法,或者没有系统的学习过,那肯定说不过去了,赶紧来补一补吧!

数据结构与算法之美_算法实战_算法面试-极客时间

推荐阅读:

程序员吴师兄:剑指 offer 面试题精选图解 04 . 二维数组中的查找 (超详细超容易理解的动画解法!!!)

程序员吴师兄:剑指 offer 面试题精选图解 03 . 数组中重复的数字(超详细超容易理解的动画解法!!!)

程序员吴师兄:LeetCode 全站第一,牛逼!

你可能感兴趣的:(算法,数据结构,java,python,编程语言)