计算机专业大学生应该在大学四年踏实学哪些东西?(2021 年 3 月持续更新)

大家好,我是程序员吴师兄,不知不觉在知乎有了好几万的关注,在此感谢大家的认可,在这些关注的读者中有不少是计算机专业的大学生或者是转行程序员,今天分享一下我对计算机专业学习路线的看法,希望对这些同学有帮助,能在大学四年里踏踏实实的学好这些内容。

这个路线简单粗暴,完全就是面向岗位(面向工资)来写的。


根据岗位要求,所需要的知识无非是编程语言、数据结构、操作系统、网络、项目、算法这几块。

一、编程语言

谈到编程语言,工作岗位上用的比较多的就是 C++、Java、Python、Go 这几种,作为准备进入互联网行业的计算机大学生,实际上不需要太纠结哪种编程语言好,每一种编程语言都有特点的应用环境,每一种编程语言都有合适的工作岗位。

如果你是在校大学生,那么我建议你从 C++ 入手开始学习,虽然 C++ 的学习路线比较陡峭,但是学完之后转其它编程语言的成本更低一些,因为很多时候你毕业后入职开始工作时,公司或者部门要让你负责的项目并不是你擅长的编程语言,不要以为面试用的是 C++,进入公司就会让你去做 C++ 后台开发、游戏开发、PC客户端开发。

推荐以下几本书:

  • C++ Primer 第5版
  • STL源码剖析(侯捷 著)
  • 深度探索C++对象模型(侯捷 译)
  • Effective C++(侯捷 译)


学习 C++ 语法,首推C++ Primer 第5版,C++ 语法学习的最权威书籍,以 C++11 来讲解,非常全面地讲解了 C++ 的语法以及 C++11 的各种新特性,看完帮助很大,如果有时间建议至少看两遍,时间有限的话,建议至少通读一遍,把握这本书的大体框架,然后结合个人情况选择性地去看一些重点章节。


STL 源码剖析这本书讲解了C++底层实现,内容包括C++底层内存管理、各种容器的数据结构实现、常见算法的实现等,建议列为必读,可以帮助深入理解C++底层,同时也是对数据结构的复习和巩固。其中也有很多面试常考的知识点,如内存池的机制、traits技法、一些常用容器的底层数据结构等。


深度探索C++对象模型这本书讲解了C++面向对象特性的底层实现机制,由于是翻译版本,读起来内容会相对晦涩一些,但是内容非常重要,尤其是虚函数底层的实现机制,建议多看几遍加深理解,这个基本是C++必问的知识点。看完这本书,对C++面向对象的理解帮助极大,建议必读。


Effective C++这本书主要讲解了编写C++程序的过程中需要注意的一些条款,有助于梳理在编写C++程序时的一些常见错误和注意事项,也是面试常考的。如果认真读过了C++ Primer,这本书看起来会非常快,其中的很多内容都包含在C++ Primer中了。

二、数据结构

看书和刷题。

推荐的书:

入门系列

入门的同学,我建议你不要过度追求上去就看经典书。

不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。

然后就放弃学算法了。

所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。

不要太在意书写得深浅,重要的是能不能坚持看完。

《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。

虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。

如果你之前完全不懂数据结构和算法,可以先从这本书看起。

《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。

作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。

当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。

所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。

基础系列

通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!

这些书籍需要你费点心思去阅读。

很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。

哎呀,要是文章的代码是 Java 语言就好了呀。

哎呀,要是文章的代码是 Python 语言就好了呀。

虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。

我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。

他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。

面试实战系列

大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。

所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。

《剑指 offer》这本书的目的非常明确,就是为了面试。

这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。

我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。

我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。


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


《编程珠玑》这本书的豆瓣评分非常高,有 9 分。

这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。

三、操作系统

无论你学习什么编程语言,和都避免不了和操作系统打交道,比如你学习 Java,用到多线程技术,实际上操作系统才是负责管理进程和线程的;比如你学习到内存分配的知识,c++里可以直接分配一段内存,此时实际上是调用操作系统提供的API进行内存分配。

如果不懂操作系统,你在未来学习编程语言的高级特效,涉及到线程进程调度,内存分配,或者是学习Linux相关的知识时,都会一头雾水,所以,只有学会了操作系统,我么才能够更好地学习其他语言和技术。

基于此,计算机操作系统的知识点频繁出现在笔试环节。

操作系统比较重要的四大模块,分别是内存管理进程管理文件系统管理输入输出设备管理

这是我学习操作系统的顺序,也是我推荐给大家的学习顺序,因为内存管理不仅是最重要、最难的模块,也是和其他模块关联性最大的模块,先把它搞定,后续的模块学起来我认为会相对轻松一些。

学习的过程中,你可能会遇到很多「虚拟」的概念,比如虚拟内存、虚拟文件系统,实际上它们的本质上都是一样的,都是向下屏蔽差异,向上提供统一的东西,以方便我们程序员使用。

还有,你也遇到各种各样的调度算法,在这里你可以看到数据结构与算法的魅力,重要的是我们要理解为什么要提出那么多调度算法,你当然可以说是为了更快更有效率,但是因什么问题而因此引入新算法的这个过程,更是我们重点学习的地方。

你也会开始明白进程与线程最大的区别在于上下文切换过程中,线程不用切换虚拟内存,因为同一个进程内的线程都是共享虚拟内存空间的,线程就单这一点不用切换,就相比进程上下文切换的性能开销减少了很多。由于虚拟内存与物理内存的映射关系需要查询页表,页表的查询是很慢的过程,因此会把常用的地址映射关系缓存在 TLB 里的,这样便可以提高页表的查询速度,如果发生了进程切换,那 TLB 缓存的地址映射关系就会失效,缓存失效就意味着命中率降低,于是虚拟地址转为物理地址这一过程就会很慢。

你也开始不会傻傻的认为 read 或 write 之后数据就直接写到硬盘了,更不会觉得多次操作 read 或 write 方法性能会很低,因为你发现操作系统会有个「磁盘高速缓冲区」,它已经帮我们做了缓存的工作,它会预读数据、缓存最近访问的数据,以及使用 I/O 调度算法来合并和排队磁盘调度 I/O,这些都是为了减少操作系统对磁盘的访问频率。

……

还有太多太多了,我在这里就不赘述了,剩下的就交给你们在学习操作系统的途中去探索和发现了。

还有一点需要注意,学操作系统的时候,不要误以为它是在说 Linux 操作系统,这也是我初学的时候犯的一个错误,操作系统是集合大多数操作系统实现的思想,跟实际具体实现的 Linux 操作系统多少都会有点差别,如果要想 Linux 操作系统的具体实现方式,可以选择看 Linux 内核相关的资料,但是在这之前你先掌握了操作系统的基本知识,这样学起来才能事半功倍。

入门系列

对于没学过操作系统的小白,我建议学的时候,不要直接闷头看书。相信我,你不用几分钟就会打退堂鼓,然后就把厚厚的书拿去垫显示器了,从此再无后续,毕竟直接看书太特喵的枯燥了,当然不如用来垫显示器玩游戏来着香。

B 站关于操作系统课程资源很多,我在里面也看了不同老师讲的课程,觉得比较好的入门级课程是《操作系统 - 清华大学》,该课程由清华大学老师向勇和陈渝授课,虽然我们上不了清华大学,但是至少我们可以在网上选择听清华大学的课嘛。课程授课的顺序,就如我前面推荐的学习顺序:「内存管理 -> 进程管理 -> 文件系统管理 -> 输入输出设备管理」。

v2-c28fa4619240e8138bc6664a66978e2d_b.jpg
B 站清华大学操作系统视频地址: bilibili.com/video/BV1j

该清华大学的视频教学搭配的书应该是《现代操作系统》,你可以视频和书籍两者结合一起学,比如看完视频的内存管理,然后就看书上对应的章节,这样相比直接啃书相对会比较好。

v2-563b08ff5c5e0f6917df3165ad888eb3_b.jpg

清华大学的操作系统视频课讲的比较精炼,涉及到的内容没有那么细,《操作系统 - 哈工大》李治军老师授课的视频课程相对就会比较细节,老师会用 Linux 内核代码的角度带你进一步理解操作系统,也会用生活小例子帮助你理解。

v2-73e3fe8e18ac5dd3248debafe75c0741_b.jpg
B 站哈工大操作系统视频地址: bilibili.com/video/BV1d

深入学习系列

《现代操作系统》这本书我感觉缺少比较多细节,说的还是比较笼统,而且书也好无聊。

推荐一个说的更细的操作系统书 —— 《操作系统导论》,这本书不仅告诉你 What,还会告诉你 How,书的内容都是循序渐进,层层递进的,阅读起来还是觉得挺有意思的,这本书的内存管理和并发这两个部分说的很棒,这本书的中文版本我也没找到资源,不过微信读书可以免费看这本书。

v2-004560d0cf83bac113c878cb206af5df_b.jpg

当然,少不了这本被称为神书的《深入理解计算机系统》,豆瓣评分高达 9.8 分,这本书严格来说不算操作系统书,它是以程序员视角理解计算机系统,不只是涉及到操作系统,还涉及到了计算机组成、C 语言、汇编语言等知识,是一本综合性比较强的书。

v2-dedb3671a0f227b44b40e90ecf07afbc_b.jpg

它告诉我们计算机是如何设计和工作的,操作系统有哪些重点,它们的作用又是什么,这本书的目标其实便是要讲清楚原理,但并不会把某个话题挖掘地过于深入,过于细节。看看这本书后,我们就可以对计算机系统各组件的工作方式有了理性的认识。在一定程度上,其实它是在锻炼一种思维方式 —— 计算思维。

四、网络

计算机网络相比操作系统好学非常多,因为计算机网络不抽象,你要想知道网络中的细节,你都可以通过抓包来分析,而且不管是手机、个人电脑和服务器,它们所使用的计算网络协议是一致的。

也就是说,计算机网络不会因为设备的不同而不同,大家都遵循这一套「规则」来相互通信,这套规则就是 TCP/IP 网络模型。

v2-7cd7bee694090e3947e390d55609d7a5_b.jpg

TCP/IP 网络参考模型共有 4 层,其中需要我们熟练掌握的是应用层、传输层和网络层,至于网络接口层(数据链路层和物理层)我们只需要做简单的了解就可以了。

对于应用层,当然重点要熟悉最常见的 HTTP 和 HTTPS,传输层 TCP 和 UDP 都要熟悉,网络层要熟悉 IPv4,IPv6 可以做简单点了解。

我觉得学习一个东西,就从我们常见的事情开始着手。

比如, ping 命令可以说在我们判断网络环境的时候,最常使用的了,你可以先把你电脑 ping 你舍友或同事的电脑的过程中发生的事情都搞明白,这样就基本知道一个数据包是怎么转发的了,于是你就知道了网络层、数据链路层和物理层之间是如何工作,如何相互配合的了。

搞明白了 ping 过程,我相信你学起 HTTP 请求过程的时候,会很快就能掌握了,因为网络层以下的工作方式,你在学习 ping 的时候就已经明白了,这时就只需要认真掌握传输层中的 TCP 和应用层中的 HTTP 协议,就能搞明白访问网页的整个过程了,这也是面试常见的题目了,毕竟它能考察你网络知识的全面性。

重中之重的知识就是 TCP 了,TCP 不管是建立连接、断开连接的过程,还是数据传输的过程,都不能放过,针对数据可靠传输的特性,又可以拆解为超时重新、流量控制、滑动窗口、拥塞控制等等知识点,学完这些只能算对 TCP 有个「感性」的认识,另外我们还得知道 Linux 提供的 TCP 内核的参数的作用,这样才能从容地应对工作中遇到的问题。

接下来,推荐我看过并觉得不错的计算机网络相关的书籍和视频。

入门系列

此系列针对没有任何计算机基础的朋友,如果已经对计算机轻车熟路的大佬,也不要忽略,不妨看看我推荐的正确吗。

如果你要入门 HTTP,首先最好书籍就是《图解 HTTP》了,作者真的做到完完全全的「图解」,小林的图解功夫还是从这里偷学到不少,书籍不厚,相信优秀的你,几天就可以看完了。

v2-c9becfec7b3746ee985ad719f35e1c71_b.jpg

如果要入门 TCP/IP 网络模型,我推荐的是《图解 TCP/IP》,这本书也是以大量的图文来介绍了 TCP/IP 网络模式的每一层,但是这个书籍的顺序不是从「应用层 —> 物理层」,而是从「物理层 -> 应用层」顺序开始讲的,这一点我觉得不太好,这样一上来就把最枯燥的部分讲了,很容易就被劝退了,所以我建议先跳过前面几个章节,先看网络层和传输层的章节,然后再回头看前面的这几个章节。

v2-9da3311721e073bdbab86329b59b618f_b.jpg

另外,你想了解网络是怎么传输,那我推荐《网络是怎样连接的》,这本书相对比较全面的把访问一个网页的发生的过程讲解了一遍,其中关于电信等运营商是怎么传输的,这部分你可以跳过,当然你感兴趣也可以看,只是我觉得没必要看。

v2-a306b2ae2504a16f55802288b81744ad_b.jpg

如果你觉得书籍过于枯燥,你可以结合 B 站《计算机网络微课堂》视频一起学习,这个视频是湖南科技大学老师制作的,PPT 的动图是我见过做的最用心的了,一看就懂的佳作。

v2-1d94c73388da86659c123f54e91732fa_b.jpg
B 站视频地址: bilibili.com/video/BV1c

深入学习系列

看完入门系列,相信你对计算机网络已经有个大体的认识了,接下来我们也不能放慢脚步,快马加鞭,借此机会继续深入学习,因为隐藏在背后的细节还是很多的。

对于 TCP/IP 网络模型深入学习的话,推荐《计算机网络 - 自顶向下方法》,这本书是从我们最熟悉 HTTP 开始说起,一层一层的说到最后物理层的,有种挖地洞的感觉,这样的内容编排顺序相对是比较合理的。

v2-5c5498be3c013789b9086f9f4d29201c_b.jpg

但如果要深入 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的《TCP/IP 详解 卷一:协议》这本书,是进一步深入学习的好资料,这本书的作者用各种实验的方式来细说各种协议,但不得不说,这本书真的很枯燥,当时我也啃的很难受,但是它质量是真的很高,这本书我只看了 TCP 部分,其他部分你可以选择性看,但是你一定要过几遍这本书的 TCP 部分,涵盖的内容非常全且细。

v2-78a3978980f50029ba6091976c9ab113_b.jpg

要说我看过最好的 TCP 资料,那必定是《The TCP/IP GUIDE》这本书了,目前只有英文版本的,而且有个专门的网址可以白嫖看这本书的内容,图片都是彩色,看起来很舒服很鲜明,小林之前写的 TCP 文章不少案例和图片都是参考这里的,这本书精华部分就是把 TCP 滑动窗口和流量控制说的超级明白,很可惜拥塞控制部分说的不多。

v2-a76a1550502b96f797c6e9a330627840_b.jpg
白嫖站点: tcpipguide.com/free/t_T

当然,计算机网络最牛逼的资料,那必定 RFC 文档,它可以称为计算机网络世界的「法规」,也是最新、最权威和最正确的地方了,困惑大家的 TCP 为什么三次握手和四次挥手,其实在 RFC 文档几句话就说明白了。

TCP 协议的 RFC 文档: datatracker.ietf.org/do

实战系列

在学习书籍资料的时候,不管是 TCP、UDP、ICMP、DNS、HTTP、HTTPS 等协议,最好都可以亲手尝试抓数据报,接着可以用 Wireshark 工具看每一个数据报文的信息,这样你会觉得计算机网络没有想象中那么抽象了,因为它们被你「抓」出来了,并毫无保留地显现在你面前了,于是你就可以肆无忌惮地「扒开」它们,看清它们每一个头信息。

那在这里,我也给你推荐 2 本关于 Wireshark 网络分析的书,这两本书都是同一个作者,书中的案例都是源于作者工作中的实际的案例,作者的文笔相当有趣,看起来堪比小说一样爽,相信你不用一个星期 2 本都能看完了。

v2-26e528c59f4a54528c70d8a98a8b0303_b.jpg


五、项目

有一个拿的出手的项目无论是去实习还是工作面试,都是一个重要的加分项,项目从哪来呢?

GitHub,永远滴神!

虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。

后来自己花了一个星期看完了 Python 的基础知识,就想着找点项目看一看,学一学,练一练,这个时候我才真正的去了解 GitHub,开始了在 GitHub 的瞎逛之旅,在开始之初,随之而来的问题是我不知道哪些项目当时还是新手的我,哪些项目是好项目,哪些项目好玩有价值。

虽然现在我已经在 GitHub 上逛的相当流畅,但我还是想如果有一个东西可以收集这些对新手友好的东西,那么我当时可以少走更多的弯路,节省更多的时间吧。

那么有这么一个东西么?

有的,而且已经做了三年多,这就是HelloGitHub,一个分享 GitHub 上有趣,入门级的开源项目。

v2-696f3022e0884e58ee33f9764c0183b7_b.jpg


GitHub 网址:github.com/521xueweihan

在项目中,内容每月 28 号以月刊的形式更新发布,主要是面向编程新手、热爱编程、对开源社区感兴趣人群的项目。更新的内容主要包括:各种语言的流行项目、入门级项目、让生活变得更美好的工具、书籍、学习心得笔记、企业级项目等。

v2-08c70b9d3eb9a0bcafac6dc523ccb614_b.jpg


这些项目都有一些共同的特征,那就是很酷,非常容易上手的项目,编程的魅力和便捷体验起来就是这么简单。

v2-0dd29b558060709fb465d19c16c84d08_b.jpg


再次给出 GitHub 地址: github.com/521xueweihan


下面我们就来看看,这个项目具体包括啥,我们以最新的月刊(43 期)为例。

v2-69f3f2a7eb14fd9f2087587aad6500d3_b.jpg


0x00 简介

v2-b7246002f0cc9d5596f144a5239b28f8_b.jpg


0x01 目录

v2-ea14380c16e2392ea2538f7d9fa4c82a_b.jpg


0x02 内容

每个类型的项目我们挑一个来看。

C 项目

tmux:一个终端复用工具,可极大的提高工作效率。

  • 提供了强劲的、易于使用的命令行界面;
  • 可横向和纵向分割窗口;
  • 窗格可以自由移动和调整大小,或直接利用四个预设布局之一;
  • 可在多个缓冲区进行复制和粘贴;
  • 可通过交互式菜单来选择窗口、会话及客户端;
  • 等等。


v2-59d5bdcf77746003fe593a0e2749e61d_b.jpg


C# 项目

BenchmarkDotNet:功能强大的用于基准测试 .NET 库。

v2-5fff128abfbb91852d2e0217ac0ce041_b.jpg


C++ 项目

dbg-macro:打日志是 C++ 开发中必不可少的一种 debug 方式,dbg-macro 受 rust-lang 中 的 dbg 启发,提供比 printf 和 std::cout 更好的宏函数。主要有如下特点:

  • 美观的彩色输出(当输出不是交互式终端时,颜色将自动禁用);
  • 兼容 C++11,并且是 header-only;
  • 支持基础类型和 STL 容器类型的输出;
  • 除了基本信息外,还输出变量名和类型;
  • 启用 DBG_MACRO_DISABLE 生成 release 版。

Go 项目

go-admin:基于 Golang 语言的数据可视化与管理平台。特性如下:

  • 高生产效率:10 分钟内做一个好看的管理后台;
  • 主题:默认为 adminlte,更多好看的主题正在制作中,欢迎给我们留言;
  • 插件化:提供插件使用,真正实现一个插件解决不了问题,那就两个;
  • ✅认证:开箱即用的 rbac 认证系统;
  • ⚙️框架支持:支持大部分框架接入,让你更容易去上手和扩展。


v2-160978ce90da4ef6e2520553b5416719_b.jpg


Java 项目

eladmin:基于 Spring Boot 2.1.0、Vue 的前后端分离的后台管理系统,支持数据字典与数据权限管理、一键生成前后端代码、前端菜单动态路由等。基于 Spring Boot2.1.0 框架,涉及的技术栈:非关系数据库 redis、接口测试工具 swagger、druid 数据源驱动、邮件依赖(javax.mail)、三方支付和云存储 SDK、页面模板引擎 freemarker。技术栈丰富,初学者可以作为实战项目学习和使用。

v2-796e6030b1933ab49a9f213c04de37f6_b.jpg


JavaScript
chart-race-react:一个简单易用的 Bar Chart Race(长条图赛跑动画) React 组件。示例代码:

import ReactDOM from 'react-dom'; import BarChart from 'chart-race-react'; ReactDOM.render(<BarChart />, document.getElementById('root'));

v2-a2f8494b6ecc84d4e33017d309ecc164_b.jpg


Python 项目

TagUI-Python:一个 Python 自动化操作的库。比如:自动打开网页并截图,示例代码:

t.init() t.url('google.com') t.type('q', 'decentralization[enter]') t.snap('page', 'results.png') t.close()

Ruby 项目

shift:一个 Ruby 语言写的在线 MySQL 数据库迁移工具。

v2-1b27ca15d1c4484e047f68e3d625faa4_b.jpg


v2-244d28a5cfef33dfdb47cb0d7fa986c8_b.jpg


Swift 项目

Percent:让 Swift 语言支持百分比类型,消除精度缺失的烦恼。示例代码:

import Percent 10% + 5.5% //=> 15.5% -10% / 2 //=> -5%

其他

cascadia-code:微软开源的一套等宽字体,有趣的是可以组合字符创建新的字形。组合效果如下:


开源书籍

python_ebook:Python 编程相关的电子书资源集合项目。

book:(英文)《Cosmic Python》讲述如何管理复杂性的 Pythonic 应用程序结构的书籍。

csBook:iCSToCS/CSBook

教程

BigData-Notes:大数据入门教程,该教程介绍了大数据常用技术栈的基础和核心知识。内容涵盖:Hadoop、Spark、Storm、HBase、Hive、ZooKeeper、Kafka 等。

机器学习

dimensionality_reduction_alo_codes:该项目使用 Python 实现了 11 种经典的数据抽取(数据降维)算法。同时附有相关资料、展示效果,适用于机器学习初学者和刚刚入坑数据挖掘的小伙伴。

v2-f671b372fe7886945ae45cce5b4755f7_b.jpg


六、算法

为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

v2-f221b3de2a863b53ef0cb75fec879d72_b.jpg


这里面有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、图

浅谈什么是图拓扑排序

数据结构与算法——图论基础与图存储结构

数据结构与算法:三十张图弄懂「图的两种遍历方式」

数据结构与算法——图最短路径

总结

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。

如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。


部分内容参考:
编程初学者如何在GitHub寻找适合自己的小项目?
mp.weixin.qq.com/s/yopn

  • 15
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值