01 - 为什么要有这么多数据结构
在学具体的数组、链表、树之前,先想明白一个问题:为什么不能只用一种数据结构走天下? 想通了这个,你后面学每一种结构时,就不会死记硬背,而是能理解「它是为了解决什么才被发明出来的」。
数据结构 = 组织数据的方式
数据结构,就是「数据在计算机里怎么组织、怎么摆放」的方式。
同样一堆数据,摆放方式不同,做某些操作的效率会天差地别。举个生活里的例子——你有一大堆书,怎么放?
- 随便堆成一摞:放书快(往上一扔就行),但找某本书要一本本翻,慢。
- 按书名字母排好放书架:找书快(直接定位),但插一本新书要挪动后面一排,慢。
- 按主题分类建个目录:找特定主题快,但维护目录有成本。
看,没有哪种摆法「样样都好」。每种组织方式都是在不同操作之间做取舍。 数据结构也一样。
核心:不同结构,擅长不同操作
我们对数据最常见的操作无非几种:
- 增:加一个新数据
- 删:删掉一个数据
- 查:找到某个数据
- 改:修改某个数据
- 遍历:把所有数据挨个过一遍
关键在于:没有任何一种数据结构能让所有操作都最快。 一种结构往往是「某些操作快,另一些操作慢」。比如(先有个印象,后面章节细讲):
- 数组:按位置读取超快,但中间插入/删除很慢。
- 链表:中间插入/删除快,但按位置查找慢。
- 哈希表:查找某个值快到「秒查」,但数据是无序的。
- 树:查找、插入都还不错,还能保持有序。
所以「学这么多数据结构」的意义,不是让你记住一堆名词,而是:手里多几件趁手的工具,遇到不同的活儿能挑对的用。
选数据结构,本质是「预判你要频繁做什么操作」
选哪种数据结构,取决于你最在乎哪个操作快:
- 如果你要频繁「按值查找有没有」→ 优先想哈希表。
- 如果你要频繁「在两端增删」→ 想队列 / 栈。
- 如果你要频繁「保持有序还要能快速查找」→ 想树。
- 如果你的数据是「谁和谁有关系」的网状 → 想图。
一句话:先问「我最常做什么操作、最怕什么操作慢」,再去挑那个正好扬长避短的数据结构。 这就是「选型思维」,也是这整篇教程想教给你的核心能力。
数据结构 vs 算法
顺便厘清两个总被放一起的词:
- 数据结构:数据怎么组织存放(本教程的重点)。
- 算法:在这些数据上怎么一步步操作来解决问题(比如怎么排序、怎么查找)。
两者关系密切:好的数据结构,能让算法又简单又快;选错了结构,再聪明的算法也跑不快。 这也是为什么我们主张:先把数据结构本身吃透。
小结
- 数据结构 = 数据的组织摆放方式;摆法不同,各种操作的效率天差地别。
- 常见操作是增、删、查、改、遍历;没有一种结构能让所有操作都最快,每种都是取舍。
- 学多种数据结构,是为了手里多几件趁手工具,遇到不同的活挑对的用。
- 选型的核心思维:先问「我最常做什么操作、最怕什么慢」,再挑扬长避短的结构。
- 数据结构管「怎么存」,算法管「怎么操作」;结构选对了,算法才能又简单又快。
下一章 → 02 - 怎么衡量快慢:大 O 复杂度 | 回到 README 目录