一句话说清
数据结构是数据的摆放方式,摆法不同,操作快慢就不同。
为什么值得懂
同样一批名字,是排成一列紧挨着的格子,还是散落各处用线牵着,决定你找一个名字要翻几下。程序慢、面试答不上来,常常不是循环写错了,而是摆放方式选错了。《算法》讲怎么算,这篇讲放在哪。
零基础讲解
每种数据结构都在替三种操作定价:查找、插入删除、遍历。没有摆法能让三种都便宜,只能选一种,替另一种付账。
数组:一排连续的格子。 它占内存里连续的一段,「第 5 个」能算出地址直接跳过去;往中间插一个,后面元素都要往后挪。
链表:散落的格子,每个记着下一个的地址。 插入只改两根线;找第 100 个,只能从头走。
栈与队列:给操作加顺序纪律。 栈后进先出,像一摞盘子;队列先进先出,像排队买票。它的价值在于把顺序变成结构,函数调用与撤销都靠它。
哈希表:把名字换算成位置。 存和取各算一次,平均几乎一步到位。主流观点是「平均很快」:位置会撞车,撞得多就退化,且不保留顺序。
树:有层次的摆放。 每往下一层就排除一大半,既快又有序,数据库索引就是树。
图:记录谁和谁有关系。 节点加连线,社交关系、路网、任务依赖都用它;它管的是关系,不是快慢。
《算法导论》第 10 章把这些摆法统一成「基本数据结构」。选结构就是选代价——也是《编程思维》的第一步。
一个例子
同一个通讯录:数组存,找一个号码平均看一半;哈希表存,算一次就跳到位。但要「按拼音顺序打印全部联系人」,哈希表得先取出来重排,有序数组本来就排好了,还能二分查找。需求换一个动作,最优结构就换了人。
常见误解
- 以为存在「最好」的数据结构:只有最合某个动作的那一种。
- 以为哈希表永远一步到位:那是平均情况,撞车严重就会退化。
- 以为链表插入一定更快:找到位置本身就要花时间。
应用场景
- 生活:整理工具箱时按取用频率分层,最常用的放手边。
- 职场:做表前先问最常做的是按名字找还是按日期排,前者加查找键,后者维护排序。
- 写作与创作:给人物与伏笔建索引表,记下谁在第几章出现。
关联知识点
- 算法(algorithm,先读那篇拿到复杂度这把尺子)
- 编程思维(programming-mindset,把问题拆成数据与操作)
- 数据库(database,索引就是树与哈希的落地)