数据结构:导论
目录
什么是“第一性原理”?
什么是“数据结构”?
数据结构解决的根本问题是什么?
数据结构的两大分类
数据结构的基本操作
数据结构与算法的关系
学习数据结构的底层目标
什么是“第一性原理”?
在正式进入数据结构之前,我们先要厘清一个核心学习方法 —— 第一性原理(First Principles Thinking)。
第一性原理是指:将问题分解到最基本、最不可再简化的真理,再从这些基础出发,逐步构建出复杂系统。
在学习数据结构时,我们不是去“记住”链表或栈的定义,而是要问:
-
信息为什么需要结构化?
-
什么是“数据”?
-
为什么某些结构比其他结构更高效?
这些追问,就是从底层理解“数据结构”的真正方式。
什么是“数据结构”?
数据结构是一种组织、管理和存储数据的方法,使得我们能够高效地访问(access)和修改(modify)数据。
用类比来说:
-
数据是信息的原材料;
-
数据结构是存储这些信息的“容器”或“建筑架构”;
-
算法(Algorithm)是使用这些数据的“操作方法”或“工具”。
举个生活中的例子:
假设你有很多图书,如果你用一个盒子乱装(未使用数据结构),查找某本书要花很长时间。如果你按作者排序放进书架(使用结构化的存储),查找速度就快得多。
数据结构的本质作用就是为信息组织提供一种有序、高效的框架,帮助我们实现以下三大目标:
-
更快地访问数据(Access)
-
更节省地存储数据(Storage)
-
更灵活地修改数据(Modify)
Harsha 在课程中强调:算法和数据结构是两翼,缺一不可。算法提供策略,结构决定效率。
数据结构解决的根本问题是什么?
用第一性原理回溯,我们可以这样问:我们为什么需要数据结构?
我们要解决的问题主要包括:
-
存储(Storage):如何有效存储大量数据?
-
访问(Access):如何快速地找到我需要的数据?
-
修改(Modification):如何快速更新或删除数据?
-
扩展性(Scalability):当数据量变得很大时,系统是否还能正常运行?
数据结构的三大核心指标:
中文术语 | 英文术语 | 说明 |
---|---|---|
时间复杂度 | Time Complexity | 处理数据需要多长时间(O(n)、O(log n) 等) |
空间复杂度 | Space Complexity | 占用多少内存或存储资源 |
可扩展性 | Scalability | 随着数据量增长性能是否可控 |
他强调:“设计数据结构就是在不同指标之间做权衡(Trade-off)。”
简而言之:
数据结构存在的根本目的是:用更少的时间和空间,完成更多的数据处理任务。
数据结构的两大分类
(Two Major Categories of Data Structures)
1. 线性结构(Linear Data Structures)
数据元素按线性顺序排列,每个元素最多只有一个前驱和一个后继。
名称(中文) | 名称(英文) | 示例 |
---|---|---|
数组 | Array |
|
链表 | Linked List |
|
栈 | Stack | 后进先出 LIFO |
队列 | Queue | 先进先出 FIFO |
这些结构适合处理“有顺序”的数据。
2. 非线性结构(Non-Linear Data Structures)
数据之间的关系不是线性的,一个元素可能连接多个元素。
名称(中文) | 名称(英文) | 示例 |
---|---|---|
树 | Tree | 文件目录结构 |
图 | Graph | 社交网络,地图 |
堆 | Heap | 优先队列 |
哈希表 | Hash Table | 键值存储(key-value) |
这些结构用于表达复杂关系,比如父子关系、网络结构等。
数据结构的基本操作
无论哪种数据结构,都要支持以下基本操作(Basic Operations):
-
插入(Insertion):添加新元素
-
删除(Deletion):移除已有元素
-
查找(Searching):定位某个特定元素
-
遍历(Traversal):访问所有元素
-
排序(Sorting):按特定顺序组织数据
每种操作的效率依赖于你选择的数据结构。
数据结构与算法的关系
数据结构是用来存储数据的,算法是处理数据的。
它们之间的关系如下:
数据结构 | 算法 |
---|---|
是房子 | 是住在房子里的人 |
是刀鞘 | 是刀 |
是存储器 | 是处理器 |
比如:使用哈希表(Hash Table),你可以在O(1) 时间内查找数据。这就是结构与操作的完美结合。
学习数据结构的底层目标
学习数据结构不是为了背公式,而是为了掌握一种解决问题的思维框架(problem-solving mindset):
-
如何选择最合适的结构?(Trade-offs:时间 vs 空间)
-
如何让代码变得更快、更稳定、更易维护?
-
如何通过“结构”的设计,获得“算法”的力量?