数据结构到底该怎么学?
网友提问:
数据结构到底该怎么学?
Yt回复:
一、数据结构是必过的关
数据结构,是每一个计算机相关专业的朋友必须过的关。
不管是严蔚敏严老那本书,还是《算法导论》,里面讲的数据结构,作为一个计算机相关专业的学生,这是一个必过的槛。
就像考驾照、参加高考一样,每个人必须都得参加。
数据结构,就是这样的存在。
二、我是怎么学数据结构的
我讲讲我曾经是怎么学的。但我的方法不一定和你类似。
在我们那个年代,网上连现成的队列、栈、链表的代码都没有。
我当时是看严蔚敏严老那本教材,从链表开始,到双链表、环形链表、队列、栈,然后到树——二叉树、二叉平衡树、哈夫曼树、234树、红黑树,再到后面的图——深度优先、广度优先、Dijkstra、Prim……
这些,我都是自己亲手实现过的。
每一行代码,都是自己敲出来的。
三、自己实现一遍,你会得到什么?
我认为这个过程,你要把数据结构学好,至少你要自己实现一遍。
实现出来之后,你会得到至少两个好处:
好处一:告别语法问题
你把数据结构都实现完以后,你将不会对语法有任何疑问。
不管你是选择C、C++还是Java——你实现一遍之后,这门语言的语法,你不可能再有任何疑问。
你不会因为链表这种基础数据结构而不懂。
指针、数组、函数指针……你基本上都会很熟悉。
因为实现一遍下来,大概的代码会有五六千行,五千行以上。
这五千行代码敲完,你就将彻底告别语法问题。
好处二:驾轻就熟地选择数据结构
你会得到第二个东西:所有的数据结构,在哪个场景怎么用,你都会能够驾轻就熟。
你本能里面就能够输出:
- 这个东西一听,大概用链表可以
- 这个东西用队列可以
- 这个东西用树好像可行
因为数据结构学完之后,它才是一个刚刚的起点。数据结构将会伴随着你整个职业生涯。
遇到一个场景,你会本能地反应:
- 这个地方我可以用队列
- 这个地方我可以用红黑树
- 这个地方我可以用图
因为你实现过,你就知道哪个数据结构适合哪个场景,你就会驾轻就熟地能够去使用它。
四、如果你没有自己实现过,你会缺失什么?
如果你没有实现过数据结构,我认为你会缺失两样东西:
第一:你会有很长一段时间困惑——“我学完C语言了,我会干什么?”你被语法本身困住,走不出来。
第二:后面你做很多事情的时候,对于数据结构的理解是有缺陷的。别人说用什么,你就只能用什麼。时间复杂度、空间复杂度,你是理不清楚的。
五、怎么学?动手实现一遍
我个人认为,还是那种——你自己去跟着动手实现一遍。
即使现在有AI了,我依旧要求你实现一遍。
当然,你在调试代码的时候,可以用AI给予你一些思想上的帮助。
我记得当时我在实现红黑树的时候,删除这个动作在《算法导论》那本书里,只给出了:
- 添加的伪代码
- 定义红黑树的伪代码
- 左旋的伪代码
- 右旋的伪代码
- 三种插入情况的伪代码
对于四种删除的情况,是没有代码的。
当时删除这个过程,我是自己梳理、自己写的。在这个过程中,但凡有一点不对,它就运行不起来——core dump、段错误……你得硬着头皮上。
我们当时是没有AI来帮忙解的。
六、现在有条件了,更要动手
我认为现在,任何一个数据结构本身,都不会成为很难的点。因为很多东西都有现成的,网上一搜一大把。
但是——这个过程你一定要自己梳理一遍。
所有的数据结构,自己实现一遍,对你后面做开发,我认为还是很有益处的。
现在的条件比我们当年好太多了。有AI帮你调试、帮你解释概念,你更应该抓住机会,亲手把每一行代码敲出来。
数据结构这条路,没有捷径。
动手,就对了。
查看11道真题和解析