作为一个新手学数据结构与算法这门课时,不知道你会不会有跟我一样的疑惑。这东西是干嘛的?在计算机的硬件层面又是怎么表示的呢?

是什么?

在计算机的硬件层面,不管是 ROM、RAM 还是 CPU 都没有数据结构这一说,所有的数据都是根据高低电平的模拟电路表示,就算往上抽象一层也只有 0、1 而已(每一个封装的单元如果是高电平(3V 或者 5V)能表示数字 1,如果是低电平(0V)就表示数字 0)。

到这里还只是简单开关逻辑的电路,通过英国数学家「布尔」在 19 世纪发明的「二进制逻辑运算」,可以进行简单的二进制的逻辑运算。之后「香农」在硕士论文中,提供了一个能将加、减、乘、除运算变成布尔的二进制逻辑运算能力,至此任何可计算的问题都可以通过简单的逻辑电路表示。我们将很多这样的逻辑电路单元并列,就得到了存储任何信息的能力。

对于 10110011 这样的一串字符人眼看很容易出错,然后在数学上可以证明任何编码系统都是等价的,所以计算机科学家们就发明了「数据结构」这个东西,用来将数据组织成一种人类更容易理解的形式。
我们有了数据的存储形式,存储了数据之后总要使用数据吧,那就有 Create(创建)、Read(读取)、Update(更新)和 Delete(删除)等等操作数据的方法。我们就把这些方法叫做「算法」。
从广义上讲,数据结构就是一组数据的存储结构算法就是操作数据的一组方法。所以数据结构是为算法服务的,算法也要作用在特定的数据结构之上。

从狭义上来讲,数据结构和算法就是那些经典的数组、链表、二叉树、二分查找、动态规划等等。现在数据结构、算法层出不穷,而且我们写的 Class、Object、for、while 等都算数据结构和算法。这些经典的都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。
所以我们主要学习这 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树。10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法

怎么学?

1. 找重复

任何算法最后都是抽象为「if-else」、「for-loop」、「recursive」代码来表示。所以我们就是要找的逻辑中重复的部分。

2. 刻意练习

学习了覃超老师的「算法训练营」最大的收获就是五毒神掌了,刷算法题不应该死磕,算法都是有套路的。比如:「双指针」、「多指针」、「快慢指针」、「哈希表」等等,这些方法需要多写多做就能熟练运用。

有不熟练的类型的题目就针对这个种类反复练习,然后过一天、一周、面试前一周重新做一遍题目,加深记忆。

3. 主动寻求 Feedback

算法题可以去 leetcode 的中文和英文站,看全中国和全世界网友的代码和解题思想。

在工作、生活中不是时时都有人给你 review 代码,给你提意见。我们也可以在 GitHub 上找优秀的库的源代码、或者看对应编程语言的源代码(如:Java),去学习好代码、工业级代码应该是怎样写的。

4. 优化代码的思想

优化算法基本上有两个重要的思想:升维、空间换时间。

「升维」的应用:
对链表的查询操作进行优化,进行升维之后就得到了「跳表」这个数据结构。

「空间换时间」的应用:
比如,「两数之和」的哈希表解法。

参考:
02 | 如何抓住重点,系统高效地学习数据结构与算法
Wikipedia 算法
Wikipedia 数据结构