目录

绪论:数据结构与算法详解 (进阶版)

“程序设计 = 数据结构 + 算法” —— 尼克劳斯·沃思 (Niklaus Wirth, 图灵奖得主)

如果把编程比作烹饪

本教程旨在通过可视化的方式,深入剖析计算机科学的这两大基石。

第一部分:数据结构 (Data Structure)

数据结构不仅仅是存储数据,更是为了高效地检索和操作数据。

1. 核心概念辨析

在深入具体结构前,我们需要厘清以下术语的层级关系:

术语 定义 举例 (学生管理系统)
数据 (Data) 描述客观事物的符号,是计算机操作的对象 整个数据库文件
数据元素 (Data Element) 数据的基本单位,在程序中通常作为一个整体处理 一名学生的完整记录 (行)
数据项 (Data Item) 构成数据元素的最小单位,不可分割 学生的学号、姓名、性别 (列)
数据对象 (Data Object) 性质相同的数据元素的集合 所有学生的集合 (表)

2. 逻辑结构:数据之间的“思想关系”

逻辑结构是指数据元素之间的相互关系,它与数据在计算机中的存储位置无关。我们通常将其分为四类。

集合结构 (Set)

元素同属一个范围,但无序、无关联。

例:购物车里的商品

线性结构 (Linear)

元素首尾相接,严格的一对一顺序。

例:排队、链表、数组

树状结构 (Tree)

一对多的层级关系,严谨的分支体系。

例:公司组织架构、文件系统

图形结构 (Graph)

多对多的网状关系,任意节点皆可相连。

例:互联网、神经网络、交通图

2.1 集合 (Set)

2.2 线性结构 (Linear)

2.3 树状结构 (Tree)

2.4 图形结构 (Graph)

3. 存储结构:数据在“内存”中的物理形态

逻辑结构是“想出来的”,存储结构是“写在内存条上的”。

3.1 顺序存储 (Sequential Storage)

3.2 链式存储 (Linked Storage)

3.3 索引存储与散列存储

第二部分:算法 (Algorithm)

算法是解决特定问题求解步骤的描述。一个好的算法应该具备:正确性、可读性、健壮性、高效率

1. 算法效率度量:大O记号

我们不计算具体的秒数(因为这取决于机器性能),而是计算操作步骤数量随数据量 $n$ 的增长趋势

时间复杂度直观对比 (n 增大时)

O(1)
极快 (索引)
O(log n)
很快 (二分)
O(n)
一般 (遍历)
O(n²)
很慢 (冒泡)

1.1 常见复杂度详解

    int n = 10000;
    x = n + 1; // 无论n多大,这行只执行一次
    for(int i=0; i<n; i++) { ... }
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) { ... }
    }
    while(n > 1) {
        n = n / 2; // 1024 -> 512 -> 256 ... 10次就到了
    }

第三部分:五大常用算法思想详解

这是算法的灵魂,掌握这些思想比背诵代码更重要。

1. 穷举法 (Brute Force)

2. 分治法 (Divide and Conquer)

大问题 (排序 8 个数)
↓ 拆分 (Divide)
子问题 A
子问题 B
↓ 递归解决 (Conquer)
A1
A2
|
B1
B2
↑ 合并结果 (Merge)

3. 动态规划 (Dynamic Programming, DP)

普通递归 (傻算)
f(5) 需要算 f(4) 和 f(3)
f(4) 需要算 f(3) 和 f(2)
f(3) 被重复计算了!
动态规划 (记账)
算过 f(3) 吗?
算过 -> 直接查表
没算 -> 算出并填表
f(1)
f(2)
f(3)
...

4. 贪心算法 (Greedy)

5. 回溯法 (Backtracking)

X 死路
√ 通路

先试上方(红),走不通 -> 回溯 -> 改走右方(绿)

总结:如何选择算法?

场景特点 推荐策略 核心思想
问题可拆分,子问题独立 分治法 大事化小
问题可拆分,子问题重叠 动态规划 拒绝健忘,查表
需要快速找到一个可行解 贪心算法 目光短浅,先拿再说
需要遍历所有解或路径 回溯法 不撞南墙不回头
没有任何规律 穷举法 暴力出奇迹