一张图看懂「常见数据结构」:大白话 + 漫画
你打开一个 App,刷一刷、存点东西、搜个好友——背后都是数据结构在干活。
别被名字吓到,数据结构其实就是“怎么把东西摆好,方便以后找、方便以后改”。这篇文章用大白话(外加几张漫画)把最常见的 8 种一次讲清楚。
一、数组(Array)= 一排带编号的储物柜
数组最简单:在内存里给你一排连在一起的格子,从 0 开始编号。
- 想知道第 3 个是什么?直接按编号 2 去拿,一步到位(时间复杂度 O(1))。
- 缺点是:这排格子长度固定,中间想插一个,后面所有人都得往后挪,费劲。
一句话:下标访问快,插入删除慢。
二、链表(Linked List)= 寻宝线索,每关指向下一关
链表不追求“排排坐”,而是每个节点都记着“下一个是谁在哪”。
- 想从头找到尾,就顺着线索一个个走下去。
- 想在中间插入?只要改一下前后两条线索,不用搬动其他人,插入删除快。
- 代价是:不能跳着找,想知道第 5 个,得从第一个一路数过去,随机访问慢。
一句话:插入删除快,但找不到第几个直接拿。
三、栈(Stack)= 一摞盘子,后进先出
想象你洗碗,洗好的盘子往上叠。最后放上去的,最先被拿走——这就是“后进先出” LIFO。
- 只能从顶部放(push)和取(pop)。
- 典型场景:撤销操作(Ctrl+Z)、函数调用、浏览器后退。
一句话:只许一头进出,后进的先出。
四、队列(Queue)= 排队买票,先进先出
排队大家都熟:先来的人先办完走人——这就是“先进先出” FIFO。
- 新来的站到队尾(enqueue),办完的从队首离开(dequeue)。
- 典型场景:打印机排队、消息队列、秒杀排队。
一句话:一头进一头出,先来的先走。
五、哈希表(Hash Table)= 按名字直接找衣柜
你去健身房,柜子太多记不住位置?那就给每个柜子编个号,按名字算编号。
“小明”这个名字经过一个叫哈希函数的小机器,立刻算出该去第 7 号柜——一步到位,不用挨个找。
- 理想情况下存取都是 O(1),超级快。
- 万一两个名字算到同一个柜子(哈希冲突),就用“链地址法”在同一个柜子挂一串。
一句话:用名字算位置,查找飞快。
六、树(Tree)= 家谱 / 公司组织架构
树就是一个根,往下分叉:老祖宗在顶上,孩子是分支,最底下的叫叶子。
- 二叉树最多两个孩子,常用于高效查找(二叉搜索树:左小右大)。
- 文件系统、公司层级、DOM 结构,全是树。
一句话:一层管一层,查找能砍掉一半。
七、堆(Heap)= 小顶金字塔
堆是一棵特殊的树,规矩是:父节点永远比孩子“小”(小顶堆)或“大”(大顶堆)。
- 所以最小的那个一定在塔尖,取最小值只要 O(1)。
- 典型场景:优先队列、Top-K 问题、堆排序。
一句话:塔尖永远是最大或最小,取最值飞快。
八、图(Graph)= 朋友圈 / 地铁线
前面的结构大多“一条道”,图就不一样了:任意两点都能连,还能成环。
- 节点是人,边是“认识/连通”。
- 地铁线路图、社交网络、地图导航,全是图。
- 经典问题:最短路径(导航怎么走最快)、连通性。
一句话:谁和谁都可能是朋友,关系最自由。
九、一张表总结
| 结构 | 大白话 | 典型用途 |
|---|---|---|
| 数组 | 一排编号储物柜,下标直取 | 频繁按位置读写 |
| 链表 | 寻宝线索,逐环相扣 | 频繁插入删除 |
| 栈 | 一摞盘子,后进先出 | 撤销、函数调用 |
| 队列 | 排队买票,先进先出 | 排队、消息缓冲 |
| 哈希表 | 按名算号找柜子 | 快速查找、缓存 |
| 树 | 家谱一层管一层 | 层级数据、搜索 |
| 堆 | 塔尖最值 | 优先队列、Top-K |
| 图 | 朋友圈随意连 | 社交、导航、网络 |
看完这 8 张图,你会发现:数据结构没有谁好谁坏,只有谁更适合当下的活儿。把“东西怎么摆”想清楚,代码自然就顺了。