我是怎么学习《数据结构与算法之美》的?

我在这里分享一下我的学习思路,我将这个看起来困难的过程分成了几部分来完成。 第一部分,数据结构和算法的基础知识部分。如果在大学学过这⻔课,在专栏里,你会看到很多熟 悉的描述。有些基础比较好的同学会质疑写这些知识的必要性。这大可不必,因为每个人的基础不 一样,为了专栏内容的系统性和完整性,老师肯定要把这些基础知识重新讲述一遍的。对于这一部 分内容,如果你的基础比较好,可以像学其他课程一样,在上下班或者午休的时候进行学习,主要 是起到温习的作用。 第二部分,需要代码练习的部分。由于王争老师面试过很多人,所以在专栏里,他会列举一些他在 面试中常常会问的题目。很多情况下,这些题目需要当场就能在白板上写出来。这些问题对于想要 提升自己面试能力的同学来说,应该是很有帮助的。 我这里列举几个,你可以看看,是不是都能回答出来呢? 在链表这一节:单链表反转,链表中环的检测,两个有序的链表合并,删除链表倒数第n个结点, 求链表的中间结点等。 在栈这一节,在函数调用中的应用,在表达式求值中的应用,在括号匹配中的应用。 在排序这一节,如何在O(n)的时间复杂度内查找一个无序数组中的第 K大元素? 在二分查找这一节,二分查找的四个变体。 这些问题你都应该上手写写代码,或者在面试之前拿来练练手,而且,不仅仅只是实现主要功能。 大公司的面试很多情况下都会考虑边界条件。只要被面试官抓住漏洞,就会被扣分,所以你最好事 先写写。 第三部分,对于海量数据的处理思路问题。现在排名靠前的大公司,大都存在海量数据的处理问 题。对于这一类问题,在面试的时候,也是经常会问到的。由于这类问题复杂度比较高,很少让当 场就写代码,但是基本上会让你说一个思路,或者写写伪代码。想要解决海量数据的问题,你会的 就不能只是基础的数据结构和算法了,你需要综合应用。如果平时没有想过这部分问题,临时被 问,肯定会懵。 在专栏里,王争老师列举了大量这类问题,你要重点思考这类问题背后的思路,然后平时自己处理 问题的时候,也多想想,如果这个问题数据量大的话,应该怎么办。这样多思考,面试的时候,思 路很容易就来了。
比如,我这里随便列了几个,都是很经典的问题。你要是想不起来,就赶紧去复习吧! 比如说,我们有10GB的订单数据,我们希望按订单金额(假设金额都是正整数)进行排序,但是 我们的内存有限,只有几百MB,没办法一次性把10GB的数据都加载到内存中。这个时候该怎么办 呢?
如果你所在的省有50万考生,如何通过成绩快速排序得出名次呢? 假设我们有10万个手机号码,希望将这10万个手机号码从小到大排序,你有什么比较快速的排序方 法呢? 假设我们有1000万个整型数据,每个数据占8个字节,如何设计数据结构和算法,快速判断某个整 数是否出现在这1000万数据中? 我们希望这个功能不要占用太多的内存空间,最多不要超过 100MB,你会怎么做呢? 第四部分,工业实践部分。在每种数据结构的讲解中,老师会重点分析一些这些数据结构在工业上 的实践,封装在库里面的,一般人不注意的。 我看王争老师也是个代码分析控。一般同学可能遇到问题,查一查有没有开源软件或者现成的库, 可以用就完了。而王争老师会研究底层代码的实现,解析为什么这些在工业中大量使用的库,应该 这样实现。这部分不但对于面试有帮助,对于实际开发也有很大的帮助。普通程序员和高手的差 距,就是一个用完了就完了,一个用完了要看看为啥这样用。
例如,老师解析了Glibc中的qsort() 函数,Java中的HashMap如何实现工业级的散列表,Redis中的 有序集合(Sorted Set)的实现,工程上使用的红黑树等等。 尤其是对于哈希算法,老师解析了安全加密、数据校验、唯一标识、散列函数,负载均衡、数据分 片、分布式存储等应用。如果你同时订阅了架构、微服务的课程,你会发现这些算法在目前最火的 架构设计中,都有使用。 师傅领进⻔,修行在个人。尽管老师只是解析了其中一部分,但是咱们在平时使用开源软件和库的 时候,也要多问个为什么。写完了程序,看看官方文档,看看原理解析的书,看看源代码,然后映 射到算法与数据结构中,你会发现,这些知识和思路到处都在使用。 最后,我还想说一句,坚持,别放弃,啃下来。基础越扎实,路走得越远,走得越宽。加油!

你可能感兴趣的:(我是怎么学习《数据结构与算法之美》的?)