开篇:为什么要学数据结构与算法
一、什么是「数据结构」?
简单说:数据结构就是「数据怎么摆」。就像书可以乱堆、可以按编号排、可以按类别分架,程序里的数据也可以有不同的「摆法」。「怎么摆」直接决定了你能多快找到、插入、删除数据——选对了结构,程序省时省力;选错了,就像用勺子砍树,不是不能,而是事倍功半。
下面这些是今后会学到的常见数据结构,先混个脸熟:
同一份数据,摆法不同,能做的事和效率就不同。 比如把 1、2、3、4、5 存成「数组」:五个格子挨着排,要第 3 个直接去第 3 格;存成「链表」:每个格子带一个「下一格是谁」的指针,想找第 3 个就得从第 1 格一路跟到第 3 格。下面两幅图直观对比「数组」和「链表」的形态:
再举两个结构决定用法的例子:栈像一摞盘子,只能从最上面拿、从最上面放(后进先出);队列像排队买票,只能从队尾进、从队头出(先进先出)。下面的动画演示「栈」的入栈和「队列」的进队、出队:
小结一下:数据结构解决的是「数据怎么存、怎么组织」。选对结构,后续的查找、插入、删除才会又快又简单;选错结构,再好的算法也难救。所以本课会花不少篇幅把各种结构讲清楚,再谈在它们之上的算法。
二、什么是「算法」?
算法就是「解决问题的步骤」。比如「在 1000 万个数字里找一个数」:笨办法是一个一个看,最多看 1000 万次;聪明办法是先排序再用二分,查找时只需要大约 20 多步。步骤设计得好,就能在更短时间、用更少空间完成任务。数据结构负责「数据怎么存」,算法负责「怎么在这些数据上操作」—— 两者常常一起出现:选好结构,再配上合适的算法,程序才会既正确又高效。
两者配合:选对结构 + 用对算法,程序才又快又稳。
三、为什么值得学?效率差多少?
在电脑里,数据量一大,算法好坏会直接变成「能用」和「卡死」的差别。举个例子:
- 假设要在 1 亿个数 里找某一个数。用最笨的「逐个比较」,最坏要比较 1 亿次,在普通电脑上可能要几秒甚至更久。
- 如果先把数据排好序,再用二分查找,每次砍掉一半,大约只需要 log₂(1亿) ≈ 27 步,几乎瞬间完成。
下面这个小动画演示「二分查找」:在有序的 8 个数里找目标。绿色框是当前搜索范围,每次看中间、排除一半,范围不断缩小;被排除的一半会变灰。
从「1 亿步」到「27 步」,这就是算法带来的数量级差异。再比如推荐系统要在几亿用户、几十亿条记录里做计算,地图要在无数路口里算最短路径,游戏要在每帧里做碰撞检测…… 背后都是数据结构和算法在撑腰。学好了,你不仅能写出「跑得动」的程序,还能写出「跑得快、省资源」的程序。
四、生活中处处是 DSA
你每天都在和它们打交道,只是没挂名字而已。下面每一件事背后,都有具体的数据结构在支撑:
- 地图导航:路网是「图」,最短路径用的是图算法(如 Dijkstra)。
- 推荐「猜你喜欢」:用户和物品的关系可以建模成图或矩阵,检索和排序都依赖高效的数据结构和算法。
- 手机通讯录:按拼音或首字母查,底层往往是树或哈希表,才能秒出结果。
- 浏览器「后退」按钮:最近打开的页面用「栈」存,后退就是弹栈。
- 排队买票:先到先服务,典型的「队列」。
理解这些,你再看技术文章或面试题,就不会觉得是「凭空冒出来的概念」,而是「原来就是这些东西在干活」。
五、这门课怎么学?
我们会按「深入浅出」的顺序来:
- 先讲复杂度(怎么衡量快慢、占多少内存),这样你后面看每个算法都能自己判断「好不好」。
- 再从最基础的数组、链表、栈、队列开始,然后哈希表、树、图,每种结构都会说「长什么样、适合干什么」。
- 接着是排序、查找、递归、分治、动态规划、贪心等经典算法思想,配合小例子和图示,不搞题海,重在理解。
每章尽量用生活化的比喻和图示,少堆公式,多讲「为什么这样设计」。你只要会一点编程基础(能看懂循环、条件、函数),就能跟着学下来。
六、小结
数据结构 = 数据怎么存、怎么组织;算法 = 在这些数据上怎么操作、用什么步骤解决问题。学它们,是为了在写程序时「选对工具、用对方法」,让程序又快又稳。下一章我们会学习如何用「复杂度」来量化「快」和「省」—— 这是判断算法好坏的第一把尺子。