可以不考研,但不能不学 408。 —— 我自己
我不想在这里再去重申那个经典的 Why,What,How 灵魂拷问,408 的这四门课程在 IT 研究来看不可谓不重要,它不但仅仅是考研的头秃专业课,更是从事 IT 工作必备的技能。我并不打算在国内考研,但这四门课程是不能不学的。
在 408 四门课程之中,绝大多数院校的培养方案都将数据结构作为第一门课程,因为在数据结构课程之中打下的编程能力的基础为后续课程做了良好的铺垫,并且后续的课程多少都会用到数据结构和算法的思想,有助于后续课程的展开和快速理解。
这套文档的核心大纲基于《数据结构 C 语言版》(第二版),但我想很多人对该书都不慎满意,尤其是其代码描述的部分,以及他没有涉及许多真正的如今找工作面试的考点等等。因此我选择增加一些参考书,如《算法导论》,《数据结构与算法分析》,以及网络上的一些文章等等。希望能帮助各位学好数据结构与算法。
这套文档的代码有时候会使用 C,但有时候会使用 Go,理由是:
- 我非常喜欢 Go 这门语言,他语法简洁,且有着类似于 C 的表达能力,同时又具有良好的标准库和现代的语言特性。
- 我一直宣称我不会 C++,这也是我特地强调纯 C 的原因。
- Java 的核心语言特性虽然也不多,但仍然太臃肿,运行时环境也太笨重,且不使用 IDE 也不太方便。
- 理论上,只要你会使用 C,那么 Go 的语法应当也不难懂,基本上是能够理解语义的。
- 把一门语言实现的代码转写成另一种语言本身就是一种训练,而且这种训练对编程语言的掌握和理解是有极大帮助的。(想当年我看了好多 Pascal 的代码,转写成 C,并不是我想这么做而是不得不这么做)对你是否真正理解代码在做什么也是很有帮助的。
基本上来说,我会按照书上的循序写作,同时穿插一些 LeetCode 上的题目。学算法就像学数学,不做题不练习是不可能真正掌握的。
对于没有 Go 基础的读者来说,最需要强调的几个点如下:
- 不同于主流的 C 风格语法,Go 的变量声明要求变量类型在后,例如:
1// C 风格使用 int a; 声明变量
2var a int
同时可以使用 :=
进行变量声明,变量类型将自动推导,例如:
1a := 1
2// a 的类型为 int
3// 等同于 var a int = 1
4// 也等同于 var a = 1
- Go 与 C 一样,是值传递,不存在引用概念,因此要修改值,也和 C 一样需要使用指针
- Go 存在 GC,不需要像 C 一样手动管理内存,也不用过于担心内存泄漏问题
- Go 在 1.18 版本之前都不存在范型,文章中的代码不会使用范型,但是会使用
interface
特性。可以简单的将其理解成范型的一种实现方式。 - 不同于许多语言使用
new
关键字,虽然 Go 也使用new
关键字来定义一个用户定义的类型,但初始化内置类型 Go 使用make
关键字,且不存在堆栈的问题,Go 编译器会自动将变量分配到堆或栈上,因此不需要担心内存泄漏问题。因此 Go 可以写出在 C 当中绝对不合法的代码,例如返回一个栈上指针的函数,但 Go 会自动处理指针逃逸问题。
1// 在 C 中,返回栈上指针绝对是错误的
2// 但 Go 可以写这样的代码,而且这其实是非常常用的写法
3func NewNodeInt(value int) *Node {
4 return &Node{
5 Value: value,
6 Next: nil,
7 }
8}
- 不同于 C,指向结构体的指针也可以直接使用
.
来访问结构体成员。 - Go 不存在隐式类型转换,所有的类型转换都需要使用
type()
进行强制转换。 - Go 严格来说并不是一门面向对象的编程语言,但它支持给类型定义方法,它只是一种语法糖,省去了 C 中要将结构体作为第一个参数传入的麻烦。
- Go 的空指针值为
nil
. - Go 只能在一个单独的语句中使用
++
和--
,不能像 C 一样在表达式中使用,并且只存在后置写法,终于和各种魔法++
说再见了。 - 语句结尾不用
;
,妈妈终于不用担心我忘记写;
了。但;
依然作为语句结束标志,在一行中写多条语句时依然使用;
结尾。 - Go 没有 while 循环,只有 for 循环,但 for 只要只有一个条件判断语句,就是 while 循环。
- Go 的函数可以有多个返回值。再也不会有入参和出参混淆的问题了。
- 我会尽量少的使用 Go 的语言特性,因此基本上知道了上面的内容之后,代码的功能是非常容易理解的,即便不使用 Go 也应当能够理解代码,最不济也可以把代码当成伪代码来理解。
再次附上参考书目:
- 《数据结构 C 语言版》(第二版)
- 《算法导论》(第三版)
- 《数据结构与算法分析 C 语言版》(第三版)
- 代码随想录
- labuladong 的算法小抄
- OI Wiki
评论