开篇:为什么要学数据结构与算法

先听一个小故事。 小 A 的图书馆有 10 万本书,全部堆在一个大仓库里,没有编号、没有分类。有一天他想找《算法导论》,只能从第一本开始翻,翻了一下午还没找到。小 B 的图书馆也有 10 万本书,但每本书都有一个编号,并且按编号整整齐齐排好。小 B 用「二分法」:先看中间那本,比目标大就往左找,比目标小就往右找…… 每次砍掉一半,只用了十几步就找到了。同样的书、同样的目标,「怎么存」和「怎么找」 不一样,结果天差地别。这就是数据结构和算法在现实里的威力。
小 A · 乱堆
一本本翻,找一下午
小 B · 有序 + 二分
看中间,排除一半,十几步
两种图书馆:存法不同,找法不同,结果大不同

一、什么是「数据结构」?

简单说:数据结构就是「数据怎么摆」。就像书可以乱堆、可以按编号排、可以按类别分架,程序里的数据也可以有不同的「摆法」。「怎么摆」直接决定了你能多快找到、插入、删除数据——选对了结构,程序省时省力;选错了,就像用勺子砍树,不是不能,而是事倍功半。

下面这些是今后会学到的常见数据结构,先混个脸熟:

数组
一排格子,按下标访问
链表
格子串成链,靠指针连
后进先出,摞着用
队列
先进先出,排队
哈希表
按 key 快速查
一层层分叉
多点多边相连
常见数据结构一览:每一种都是「数据的一种摆法」

同一份数据,摆法不同,能做的事和效率就不同。 比如把 1、2、3、4、5 存成「数组」:五个格子挨着排,要第 3 个直接去第 3 格;存成「链表」:每个格子带一个「下一格是谁」的指针,想找第 3 个就得从第 1 格一路跟到第 3 格。下面两幅图直观对比「数组」和「链表」的形态:

数组
1 2 3 4 5
连续存放,按下标 0,1,2… 直接访问
链表
1 2 3 4
靠「下一格」指针串起来,要顺着走
同一组数据 1,2,3,4,5:数组是连续格子,链表是格子+指针

再举两个结构决定用法的例子:像一摞盘子,只能从最上面拿、从最上面放(后进先出);队列像排队买票,只能从队尾进、从队头出(先进先出)。下面的动画演示「栈」的入栈和「队列」的进队、出队:

入栈 push ↓ 出栈 pop ↑
栈顶
入栈新元素从顶部压入 · 出栈从顶部弹出(后进先出)
栈:只能从「栈顶」压入和弹出,后进先出(LIFO)
队列(先进先出 FIFO)
队尾 ← 入队 出队 → 队头
A
B
C
元素从队尾进入,向队头移动,从队头离开
队列:像排队买票,先来的先服务

小结一下:数据结构解决的是「数据怎么存、怎么组织」。选对结构,后续的查找、插入、删除才会又快又简单;选错结构,再好的算法也难救。所以本课会花不少篇幅把各种结构讲清楚,再谈在它们之上的算法。

二、什么是「算法」?

算法就是「解决问题的步骤」。比如「在 1000 万个数字里找一个数」:笨办法是一个一个看,最多看 1000 万次;聪明办法是先排序再用二分,查找时只需要大约 20 多步。步骤设计得好,就能在更短时间、用更少空间完成任务。数据结构负责「数据怎么存」,算法负责「怎么在这些数据上操作」—— 两者常常一起出现:选好结构,再配上合适的算法,程序才会既正确又高效。

数据结构
数据怎么摆、怎么存
算法
在数据上怎么操作、什么步骤

两者配合:选对结构 + 用对算法,程序才又快又稳。

小贴士: 不用死记硬背「定义」。把数据结构和算法想成「工具箱」:工具箱里有很多种工具(结构)和用法(算法),学完这一门课,你就知道什么时候该拿哪一把扳手、怎么拧最省力。

三、为什么值得学?效率差多少?

在电脑里,数据量一大,算法好坏会直接变成「能用」和「卡死」的差别。举个例子:

逐个查找
1 亿步
二分查找
≈27 步
效率对比:同样找一个数,步数差了几百万倍

下面这个小动画演示「二分查找」:在有序的 8 个数里找目标。绿色框是当前搜索范围,每次看中间、排除一半,范围不断缩小;被排除的一半会变灰。

有序数组:每次看中间,排除一半
2
5
8
11
14
17
20
23
第 1 步:看中间(11),目标>11 → 排除左半,保留右半 第 2 步:看中间(17),目标<17 → 排除右半,保留 14–17 第 3 步:看中间(14),目标=14 → 找到 (重新开始下一轮演示)
二分查找:搜索范围(绿框)每次减半,被排除的一半变灰

从「1 亿步」到「27 步」,这就是算法带来的数量级差异。再比如推荐系统要在几亿用户、几十亿条记录里做计算,地图要在无数路口里算最短路径,游戏要在每帧里做碰撞检测…… 背后都是数据结构和算法在撑腰。学好了,你不仅能写出「跑得动」的程序,还能写出「跑得快、省资源」的程序。

四、生活中处处是 DSA

你每天都在和它们打交道,只是没挂名字而已。下面每一件事背后,都有具体的数据结构在支撑:

地图导航 图 · 最短路径
猜你喜欢 图/矩阵 · 排序
通讯录 树/哈希表
后退按钮
排队买票 队列
生活中的 DSA:每项功能背后都有对应的数据结构与算法

理解这些,你再看技术文章或面试题,就不会觉得是「凭空冒出来的概念」,而是「原来就是这些东西在干活」。

五、这门课怎么学?

我们会按「深入浅出」的顺序来:

  1. 先讲复杂度(怎么衡量快慢、占多少内存),这样你后面看每个算法都能自己判断「好不好」。
  2. 再从最基础的数组、链表、栈、队列开始,然后哈希表、树、图,每种结构都会说「长什么样、适合干什么」。
  3. 接着是排序、查找、递归、分治、动态规划、贪心等经典算法思想,配合小例子和图示,不搞题海,重在理解。

每章尽量用生活化的比喻和图示,少堆公式,多讲「为什么这样设计」。你只要会一点编程基础(能看懂循环、条件、函数),就能跟着学下来。

六、小结

数据结构 = 数据怎么存、怎么组织;算法 = 在这些数据上怎么操作、用什么步骤解决问题。学它们,是为了在写程序时「选对工具、用对方法」,让程序又快又稳。下一章我们会学习如何用「复杂度」来量化「快」和「省」—— 这是判断算法好坏的第一把尺子。