一句话说清

数据结构是数据的摆放方式,摆法不同,操作快慢就不同。

为什么值得懂

同样一批名字,是排成一列紧挨着的格子,还是散落各处用线牵着,决定你找一个名字要翻几下。程序慢、面试答不上来,常常不是循环写错了,而是摆放方式选错了。《算法》讲怎么算,这篇讲放在哪。

零基础讲解

每种数据结构都在替三种操作定价:查找、插入删除、遍历。没有摆法能让三种都便宜,只能选一种,替另一种付账。

数组:一排连续的格子。 它占内存里连续的一段,「第 5 个」能算出地址直接跳过去;往中间插一个,后面元素都要往后挪。

链表:散落的格子,每个记着下一个的地址。 插入只改两根线;找第 100 个,只能从头走。

栈与队列:给操作加顺序纪律。 栈后进先出,像一摞盘子;队列先进先出,像排队买票。它的价值在于把顺序变成结构,函数调用与撤销都靠它。

哈希表:把名字换算成位置。 存和取各算一次,平均几乎一步到位。主流观点是「平均很快」:位置会撞车,撞得多就退化,且不保留顺序。

树:有层次的摆放。 每往下一层就排除一大半,既快又有序,数据库索引就是树。

图:记录谁和谁有关系。 节点加连线,社交关系、路网、任务依赖都用它;它管的是关系,不是快慢。

《算法导论》第 10 章把这些摆法统一成「基本数据结构」。选结构就是选代价——也是《编程思维》的第一步。

四种摆放方式的代价矩阵:横轴是查找的快慢,纵轴是插入删除的快慢,数组、有序数组、链表、哈希表各占一格
没有全能结构:哈希表两头都便宜但不保顺序,数组与链表各占一头,树与图管的是关系。

一个例子

同一个通讯录:数组存,找一个号码平均看一半;哈希表存,算一次就跳到位。但要「按拼音顺序打印全部联系人」,哈希表得先取出来重排,有序数组本来就排好了,还能二分查找。需求换一个动作,最优结构就换了人。

常见误解

  • 以为存在「最好」的数据结构:只有最合某个动作的那一种。
  • 以为哈希表永远一步到位:那是平均情况,撞车严重就会退化。
  • 以为链表插入一定更快:找到位置本身就要花时间。

应用场景

  • 生活:整理工具箱时按取用频率分层,最常用的放手边。
  • 职场:做表前先问最常做的是按名字找还是按日期排,前者加查找键,后者维护排序。
  • 写作与创作:给人物与伏笔建索引表,记下谁在第几章出现。

关联知识点

  • 算法(algorithm,先读那篇拿到复杂度这把尺子)
  • 编程思维(programming-mindset,把问题拆成数据与操作)
  • 数据库(database,索引就是树与哈希的落地)