第1章 绪论
第1章 绪论
1.1数据结构的研究内容
1.课程整体设计:“四大板块 + 两遍教学法”
(1)知识章节 “四大板块” 划分
老师将数据结构教材内容拆解为 4 个独立板块,明确各板块定位与核心目标,方便学生分模块聚焦学习:
| 板块序号 | 包含章节 | 板块定位 | 核心内容与作用 |
|---|---|---|---|
| 第一板块 | 第 1 章 绪论 | 引入板块 | 介绍数据结构课程本质(“问题驱动型课程”),回答 “数据结构是什么”,为后续学习奠定认知基础。 |
| 第二板块 | 第 2、3、5、6 章 | 核心板块(考试 / 面试重点) | 对应 “四类现实问题”,讲解解决问题的 “具体数据结构”,是 “真正能解决身边问题” 的核心内容,考研 / 面试中占比最高。 |
| 第三板块 | 第 4 章 | 扩展板块 | 整合 “串、数组、广义表” 三类特殊数据结构,是对核心板块的补充与延伸。 |
| 第四板块 | 第 7、8 章 | 应用板块 | 聚焦 “查找”“排序” 两大实际应用场景,将前序板块的理论知识落地到具体问题解决中。 |
(2)学习模式:“两遍教学法”(基础篇 + 提升篇)
老师创新设计 “两遍学完教材” 的模式,明确每遍的学习工具、核心目标与得分价值,适配不同学习阶段需求:
- 第一遍:基础篇(无需计算机)
- 核心目标:掌握 “概念 + 算法思想”,无需编写代码,重点是 “能用自然语言表述算法逻辑”。
- 学习工具:仅需 “纸 + 笔”,核心方法是 “画”(如画数据结构的逻辑关系、算法流程)。
- 考试价值:考研 / 面试中,“自然语言表述算法思想” 可获得 1/3 以上分数,是 “性价比极高的基础得分点”。
- 第二遍:巩固提升篇(需计算机)
- 核心目标:掌握 “算法实现 + 代码分析”,将基础篇的思想落地为可运行代码。
- 学习工具:计算机,核心方法是 “编 + 分析”(跟随老师一起编程,分析代码效率与边界情况)。
- 学习价值:形成 “从思想到代码” 的完整能力,适配实际开发与深入考试需求(如算法编程题)。
2.数据结构学习核心:“三要素合一”
老师明确数据结构的定义与学习关键 ——逻辑结构 + 存储结构 + 算法思想(或实现)= 数据结构,三者缺一不可:
-
逻辑结构:问题中 “数据之间的关系”(如线性关系、树形关系、图结构关系);
-
存储结构:数据在计算机中的 “物理存储方式”(如顺序存储、链式存储);
-
算法思想 / 实现:基于前两者,解决问题的 “步骤与逻辑”(基础篇重思想,提升篇重实现)。
老师强调:“这三个要素合在一起,既是数据结构的定义,也是学习数据结构最简单的方法”。
3.第 1 章 “绪论” 核心内容(提炼为 “2 个核心点 + 1 个考试重点”)
(1)教材内容与老师提炼的对比
| 教材标注的章节内容 | 老师提炼的核心点 | 学习要求与考试定位 |
|---|---|---|
| 1. 数据结构的研究内容 | 核心点 1:数据结构(Data Structure) | 掌握基础术语(如数据、数据元素、数据项),考试中多为 “概念题”,分数占比不高,需准确记忆。 |
| 2. 基本概念术语 | (归为核心点 1) | |
| 3. 抽象数据类型的表示与实现 | (归为核心点 1) | |
| 4. 算法和算法分析 | 核心点 2:算法(Algorithm) | 重点掌握 “时间复杂度分析”,考试中必有 “计算题”(如分析循环语句的时间复杂度),是本章唯一需计算的考点。 |
(2)数据结构的课程定位与学习信心
- 课程重要性:数据结构是计算机专业 “核心四大王牌基础课”“主轨道课程”,在历年计算机大赛中为核心内容,且是后续课程(如人工智能、软件开发)的基础 ——“数据源决定算法,数据结构是问题解决的入口”。
- 学习信心建设:老师提到 “部分学校从小学 5 年级就开始学数据结构”,强调 “数据结构不是大学专属,小学生能学好,大学生更能学好”,缓解学生对 “难学” 的焦虑。
- 问题解决逻辑:计算机领域通用问题解决流程为 “需求分析→整体设计→拆分问题→建立数学模型→找算法→编程调试→得结果”,而数据结构是该流程的 “入口”—— 只有先分析清楚 “数据与数据关系”,才能建立合理的数学模型与算法。
完整课程体系与配套资源
1. 全系列课程 “分 P 版” 选集结构
页面显示该 “分 P 版” 课程覆盖8 章内容,共 54 个课时,每章包含 “知识点讲解 + 习题”,结构完整,适配考研系统复习需求,具体章节与课时分布如下:
| 章节序号 | 章节名称 | 课时数量 | 核心课时示例(含时长) |
|---|---|---|---|
| 第 1 章 | 绪论 | 5 | 课时 1(9:40):数据结构的研究内容;课时 4(25:30):算法和算法分析;课时 5(23:34):习题 |
| 第 2 章 | 线性表 | 4 | 课时 7(10:06):线性表的顺序表示和实现;课时 8(44:06):线性表的链式表示和实现 |
| 第 3 章 | 栈和队列 | 5 | 课时 11(31:57):栈的表示和操作的实现;课时 13(33:21):队列的表示和操作的实现 |
| 第 4 章 | 串、数组和广义表 | 6 | 课时 18(37:43):串的运算(下);课时 19(28:33):数组 |
| 第 5 章 | 树和二叉树 | 9 | 课时 25(30:07):二叉树的遍历;课时 27(32:29):哈夫曼树及其应用 |
| 第 6 章 | 图 | 9 | 课时 31(37:05):图的存储结构;课时 37(43:04):关键路径 - 变量法详解 |
| 第 7 章 | 查找 | 9 | 课时 44(30:51):散列表的查找(1);课时 46(16:40):散列表的查找(3) |
| 第 8 章 | 排序 | 6 | 课时 49(24:57):插入排序;课时 51(37:05):选择排序 |
1.2数据结构的基本概念和术语
视频以 “问题驱动 + 应试技巧” 为核心,分 6 大模块拆解数据结构基础概念,每个模块均配套 “定义 + 实例 + 考试考点”,具体如下:
1. 课程讲解框架:“三个梯子” 推进(明确学习目标)
老师开篇明确本章学习逻辑,按 “三个梯子” 层层递进,为后续学习定调:
- 第一梯:概念全覆盖:无遗漏讲解数据结构核心术语(数据、数据元素、数据项、数据对象),为后续内容打基础,强调 “需记忆的术语必须牢记”(针对考研填空 / 选择题);
- 第二梯:算法聚焦计算:指出 “算法” 是考研高频考点,且常以 “计算题” 形式出现(如时间复杂度计算),后续会重点拆解计算逻辑;
- 第三梯:习题巩固:通过针对性习题检验概念掌握程度,强化考点记忆。
2. 四大核心术语:定义、区分与应试技巧(考研高频考点)
老师以 “通讯录二维表” 为核心实例,拆解 4 个核心术语,明确 “考试怎么考、怎么记”:
| 术语 | 核心定义(含区分点) | 考研考点(填空 / 选择) | 通讯录实例(3 人信息:姓名 + 年龄 + 地址) | 记忆技巧 |
|---|---|---|---|---|
| 数据 | 所有能存放到计算机中的内容(区别于 “信息”:未数字化的思维、概念,如 “气功理论”) | 仅需明确 “计算机可存储” 属性,不深考 | 赵海英的 “姓名:赵海英、年龄:28、地址:XX 路” 等所有数字化信息 | - |
| 数据元素 | 数据的基本单位,由多个关联紧密的信息组成(需承载完整意义) | 高频考点,需与 “数据项” 区分 | 每一行完整信息(如 “赵海英 + 28+XX 路”),共 3 个数据元素 | 行为元素(二维表一行) |
| 数据项 | 数据的最小不可分割单位(拆分后无完整意义) | 高频考点,关键词 “最小、不可分割” | 每一列信息(如 “姓名” 列的 “赵海英”、“年龄” 列的 “28”) | 列为项(二维表一列) |
| 数据对象 | 具有相同性质的数据元素的集合 | 理解 “集合” 属性,明确由 “数据元素构成” | 3 个数据元素(赵海英、张三、李四的完整信息)的整体集合 | 多元素合为对象 |
- 应试关键提示:老师反复强调 “基本单位是元素,最小单位是项”,填空 / 选择题直接对应答案;二维表场景下 “行为元素,列为项” 可快速判断。
3. 数据结构的双重定义与核心本质(考研答题满分要点)
视频给出两个权威定义,并提炼 “答题满分表述”,同时结合行业实例解释本质:
- 定义 1(教材经典版):相互之间存在一种或多种特定关系的数据元素的集合
- 考点陷阱:必须是 “数据元素的集合”,而非 “数据项的集合”(如通讯录是 “多行元素集合”,不是 “多列项集合”);
- 定义 2(实操版):按逻辑结构组织数据,用特定存储方法存于计算机,并定义运算集合;
- 满分答题表述:老师明确 “数据结构 = 逻辑结构 + 存储结构 + 操作(算法)”,新教材已统一此定义,考研答题按此表述 “百分之百给分”;
- 核心本质:数据结构是 “问题驱动型课程”,核心研究 “数据 + 数据间的关系”(而非单纯数据),举例 “互联网公司卖的是数据关系,而非数据本身”,强调二者缺一不可。
4. 逻辑结构:4 类分类、难度划分与实例(问题分析入口)
逻辑结构是 “判断问题难度” 的核心,老师按 “关系复杂度” 分为 4 类,明确 “结构类型对应问题难度”:
| 逻辑结构类型 | 数据元素关系 | 对应问题难度 | 实例(老师讲解案例) | 关键特征 |
|---|---|---|---|---|
| 集合结构 | 无任何关系(仅同属一个集合) | 最简单 | 一群无关联的学生名单(仅罗列,无顺序 / 层级) | 仅 “集合属性”,无逻辑关系 |
| 线性结构 | 一对一关系 | 简单 | 通讯录中 “赵海英→张三→李四”(仅相邻元素有关联) | 相邻关联,非相邻无关联,二维表均属此类 |
| 树结构 | 一对多关系 | 复杂 | 高校管理体系(校长→学院院长→系主任→教师) | 层级分支,形似 “倒立的树” |
| 图结构(网状) | 多对多关系 | 最复杂 | 社交网络(A 关注 B、A 关注 C、B 关注 C) | 任意元素间可关联 |
- 难度划分规则:简单问题(集合、线性结构),复杂问题(树、图结构);
- 问题分析步骤:老师给出 “画图法”—— 先提炼数据与关系,画出结构示意图,匹配 4 类特征即可判断难度,后续章节将针对不同结构给出解题方法。
5. 存储结构(物理结构):4 类分类、选择逻辑与效率影响(落地计算机关键)
存储结构是 “逻辑结构落地计算机” 的方式,老师明确 “逻辑结构唯一,存储结构可选”,且选择影响算法效率:
| 存储结构类型 | 核心特点(内存占用 / 访问效率) | 适用场景 | 与算法效率的关系 |
|---|---|---|---|
| 顺序存储 | 连续占用内存(如数组),访问快,插入 / 删除慢 | 频繁查询、数据量固定场景 | 访问效率高,适合需快速读取的场景 |
| 链式存储 | 不连续占用内存(如链表),通过指针关联,插入 / 删除灵活,访问慢 | 频繁增删、数据量动态变化场景 | 增删效率高,适合动态数据场景 |
| 索引存储 | 类似字典 “目录 - 正文”,需额外存储索引,检索快 | 大数据量、需快速定位场景 | 检索效率高,但占用额外内存 |
| 散列(哈希)存储 | 通过哈希函数映射到内存地址,直接访问,检索极快(理想 O (1)) | 高频查询、需极速响应场景 | 检索效率极高,但需处理哈希冲突 |
- 核心选择逻辑:
- 唯一性:一个问题的逻辑结构唯一(如通讯录必为线性结构);
- 可选性:存储结构可根据 “效率需求” 选择(如通讯录频繁查询选顺序存储,频繁增删选链式存储);
- 效率传导:存储结构→算法设计→实时响应速度(如互联网应用需 “极速响应”,可选散列存储)。
6. 数据结构学习与问题解决步骤(方法论总结)
老师给出 “三步法”,为后续章节学习铺垫思路:
- 提炼数据与关系:从问题中提取 “已知 / 未知数据” 及 “数据间关系”;
- 确定逻辑结构:画出结构示意图,匹配 4 类逻辑结构(唯一);
- 选择存储结构 + 设计算法:根据效率需求选存储结构,再设计对应算法解决问题;
- 后续衔接:老师说明 “后续章节会针对每类逻辑结构 + 存储结构的组合,给出具体算法实现”(如线性结构的顺序存储实现、树结构的链式存储实现)。
1.3抽象数据类型---ADT
围绕 “ADT” 展开系统讲解,需结合 “定义 - 构成 - 对比 - 学习方法” 逻辑拆解:
1. ADT 的定义与课程定位
- 术语本质:ADT(Abstract Data Type,抽象数据类型)是数据结构中的核心术语,本质是一种「思维方式」—— 不依赖具体编程语言,聚焦 “数据的逻辑特性” 而非 “物理实现”。
- 课程开设逻辑:数据结构课程通常开设在 C++ 等编程语言之后,但部分知名高校会在 “无语言基础” 前开设,原因是 ADT 本身是 “未实现的数据类型”,无需依赖具体语言语法,仅需理解逻辑框架。
- 考试要求:明确 ADT 是数据结构考试的必考点,需重点掌握其「形式化描述」(后续核心内容)。
2. ADT 的形式化描述:三要素构成
视频反复强调 “ADT 是三要素的组合体”,这是 ADT 的核心定义,需精准记忆:
-
三要素具体内容
:
- 数据对象:即 “数据元素的集合”(例:int 类型的数据对象是 “所有符合 int 范围的整数”,学生信息表的数据对象是 “所有学生的信息记录”)。
- 数据关系:数据元素之间的关联方式(例:int 类型的数据关系是 “连续有序”,链表的数据关系是 “节点间的指针指向关联”)。
- 操作:对数据对象可执行的处理(例:int 类型的操作是 “加减乘除、取余”,链表的操作是 “插入、删除、遍历”)。
-
形式化表示格式:需通过固定语法体现 ——
{ ADT 抽象数据类型名 },其中 “抽象数据类型名” 是「类型」(如 “线性表”“栈”),而非具体变量(如 “int a” 中的 a)。
3. ADT 与 “常规数据类型” 的区别与联系
视频通过 C/C++ 中的int“float” 等常见类型,对比 ADT 的 “抽象性” 与常规类型的 “实现性”,帮助理解二者关系:
| 对比维度 | 抽象数据类型(ADT) | C/C++ 中的常规数据类型(如 int、float) |
|---|---|---|
| 实现状态 | 未实现(仅逻辑框架,无具体存储 / 语法) | 已实现(有明确的存储方式、语法规则) |
| 核心作用 | 指导数据类型设计(定义 “该有什么”) | 直接用于编程(解决 “具体怎么用”) |
| 三要素体现 | 仅定义 “数据对象、关系、操作” 的逻辑要求 | 三要素完全落地(例:int 的三要素如下) |
| 示例(以 int 为例) | - | 1. 数据对象:C 语言中 2 字节(16 位,最高位符号位,15 位数据位);C++ 中 4 字节(32 位)2. 数据关系:连续有序(如 1<2<3)3. 操作:加减乘除、取余 |
| 本质关系 | 常规数据类型是 ADT 的 “具体实现” | ADT 是常规数据类型的 “设计依据” |
- 关键结论:二者无矛盾,ADT 决定了 “任何数据类型都必须是三要素的组合体”,而编程语言中的常规类型是这一逻辑的落地结果。
4. 数据类型的学习方法
视频明确 “学习任何数据类型都需抓三要素”:
- 无论是数据结构中的 “串、栈、队列”(ADT 的形式化描述),还是 C++ 中的 “double、char”(已实现类型),都需从 “数据对象(范围 / 集合)、数据关系(元素间关联)、操作(可执行的处理)” 三方面切入,这是掌握数据类型的核心逻辑。
1.4算法和算法分析
主讲人以 “‘四’为核心考点”“结合例子讲抽象”“紧扣考研真题” 为风格,内容分 8 个模块,每个模块均含 “知识点 + 考试重点 + 实例”,具体如下:
模块 1:数据结构基础术语回顾(00:12-00:57)—— 铺垫算法学习
- 核心术语:先复习 3 个前置知识点,避免后续理解断层:
- 数据元素 vs 数据项:数据元素是 “数据结构的基本单位”(如 “电话号码表中的一行记录”),数据项是 “最小单位”(如 “姓名” 或 “电话号码”),考试常考 “二者定义区分”,填空或选择题形式。
- 数据结构的构成:定义为 “逻辑结构 + 存储结构 + 操作”,明确 “逻辑结构 4 种”(集合、线性、树、图)、“存储结构 4 种”(顺序、链式、索引、散列),后续算法分析会依赖 “存储结构选择”(如索引存储提升查询效率)。
- 抽象数据类型(ADT):强调其 “贯穿计算机语言思维”,是 C++/Java 等语言中 “类”“结构体” 的设计基础,虽考频低,但理解后能更好地 “抽象问题”(如将 “电话号码查询” 抽象为 “线性表操作”)。
- 考试提示:“这三个术语是算法学习的基础,后续复杂度计算会隐含对‘数据结构操作’的理解,别跳过!”
模块 2:算法的核心考点框架(00:58-01:29)—— 明确学习目标
- 算法需掌握的 4 个点:主讲人开门见山,指出考研对算法的要求集中在 4 个维度,后续全程围绕这 4 点展开,避免知识点混乱:
- 定义:判断 “某描述是否为算法” 的依据;
- 特点:区分 “算法与程序”“算法与数据结构” 的关键;
- 计算:时间复杂度 + 空间复杂度(核心中的核心,占算法题 50% 以上分值);
- 设计评价:判断 “算法优劣” 的标准(如正确性、效率)。
- 记忆技巧:“用‘定义→特点→评价→计算’的逻辑记,就像‘先知道是什么,再知道好在哪,最后算出来有多好’。”
模块 3:算法定义与判断标准(01:30-02:36)—— 具象化抽象概念
- 教材定义与简化记忆:
- 教材定义:“一系列确定且在有限步骤能完成的操作”,关键词是 “确定”(每一步无歧义)、“有限”(不能无限循环)、“步骤”(有明确执行顺序);
- 简化记忆:“一系列有限步骤”,用 “炒鸡蛋西红柿” 举例 ——“洗西红柿→打鸡蛋→炒→装盘”,共 4 步(有限),每步明确(确定),符合算法定义;若说 “炒到熟为止”(无明确步骤数),则不符合。
- 考试判断技巧:“看到选项描述算法定义,先找‘有限’‘确定’这两个词,没有就排除;比如‘无限循环的操作序列’,直接判定不是算法。”
模块 4:算法的五大特点(02:37-05:10)—— 抓考试重点,避坑易错点
-
五大特点详解(含易错点):
特点 核心含义 考试重点与易错点 有穷性 有限步骤内完成,非无穷 易错点:“程序可无穷(如 24 小时安检程序),但算法必须有穷”,选择题常考 “算法是否具有无穷性”(答案:否) 确定性 每一步操作明确,无歧义 易错点:“不是正确性”(算法可能算错,但步骤必须明确),如 “加盐少许”(歧义,不符合),“加盐 1 勺”(明确,符合) 有效性 每一步可执行,且有结果(又称可行性) 考点:“无效步骤不算算法”,如 “让计算机算‘1÷0’”(不可执行,无效) 输入 零个或零个以上 举例:“计算机随机生成 1-100 的数”(无需用户输入,输入为 0 个),考试不单独考,常与输出合并 输出 至少一个以上 考点:“无输出的程序无价值,算法必须有输出”,选择题常考 “算法输出的要求”(答案:至少一个) -
记忆简化:“考试记 4 个特点即可 —— 有穷性、确定性、有效性、输入输出(合并为一个),避免记混 5 个的麻烦。”
模块 5:算法与程序、数据结构的关系(05:11-09:40)—— 理解课程核心逻辑
-
算法与程序的区别:
- 公式:程序 = 数据结构 + 算法;
- 关键差异:有穷性—— 程序可无穷(如工厂安检程序需 24 小时运行,不能停),算法必须有穷(步骤有限),因此 “程序≠算法”,选择题常考此区分,需举例记忆。
-
算法与数据结构的协同:
-
实例:“查询某城市某人的电话号码”—— 问题固定(查号码)、数据固定(姓名 + 电话),但
存储结构可选择:
- 线性存储(二维表顺序存储):需逐一匹配姓名,上亿数据时效率极低;
- 索引存储(如字典按首字母索引):先按 “姓名首字母” 定位到小范围,再匹配,效率大幅提升;
-
核心结论:“问题固定时,逻辑结构唯一,但存储结构可选择;合适的存储结构能优化算法效率,这是数据结构课程的核心!”(主讲人反复强调,考研填空 / 简答题常考此逻辑)。
-
模块 6:算法设计的评价指标(09:41-11:20)—— 明确 “好算法” 的标准
- 四大评价指标(按重要性排序):
- 正确性:算法能 “正确解决问题”(如 “查号码必须找到对应电话,而非错误结果”),是基础前提,考试不单独考,但隐含在 “算法设计题” 中(如要求写 “正确的排序算法”);
- 可读性:算法代码 “便于理解和维护”(如变量名用 “phone_number” 而非 “x”),避免 “自己写的代码自己看不懂”,考研代码题中影响阅卷老师评分;
- 健壮性:算法能 “处理异常情况”(如查号码时输入 “不存在的姓名”,需返回 “查无此人” 而非崩溃),选择题常考 “健壮性的定义”;
- 效率和低存储:“高效(时间复杂度低)+ 低存储(空间复杂度低)”,当前计算机存储容量提升,更侧重 “效率”,是复杂度计算的核心考点。
- 考试提示:“这四个指标常考‘多选题’,问‘哪些是算法设计的评价标准’,记住‘正确、可读、健壮、高效’四个词即可。”
模块 7:算法复杂度(核心考点)—— 时间复杂度 + 空间复杂度
这是整个课时的重点,占视频时长近 50%(11:21-23:10),主讲人分 “定义→计算方法→实例→效率排序” 四步讲解,全程紧扣考研计算题需求:
(1)复杂度的定位:算法优劣的 “唯一标准”
- 考点:填空时,若问 “算法优劣的评价标准”,1 个空填 “复杂度”,2 个空填 “时间复杂度和空间复杂度”,必须准确,不能写 “效率” 或 “存储”。
- 关键区分:时间复杂度 “事前预估”(不依赖计算机硬件,只看问题规模),而非 “事后计时”(不同电脑运行速度不同,无法统一标准)。
(2)时间复杂度:计算与实例
- 定义:“问题规模的函数”,即 “算法执行时间随问题规模(如数据量 N)变化的规律”,用 “大 O 法” 表示(近似值)。
- 两种计算方法:
- 语句频度法:统计 “关键语句的执行次数”(每条语句执行时间基本相同,次数即代表时间),是计算复杂度的 “基础”;
- 实例 1:单条语句(
++X; X=0;)—— 频度为 2(两条语句各执行 1 次),与 N 无关; - 实例 2:单循环(
for(I=1;I<=N;I++) {++X;})——++X执行 N 次(循环 1 到 N),频度为 N;循环条件I<=N执行 N+1 次(最后一次判断为假退出),但 “关键语句取频度最高的”,即 N; - 实例 3:双循环(
for(I=1;I<=N;I++) for(J=1;J<=N;J++) {++X;})——++X执行 N×N 次,频度为 N²。
- 实例 1:单条语句(
- 大 O 法:对 “语句频度” 取 “近似值”,规则是 “砍掉常数项、低次项和系数”,只保留 “最高次项”;
- 实例:频度为 2→O (1)(常数项),频度为 N→O (N)(一次项),频度为 N²+2N+3→O (N²)(砍掉低次项 2N 和常数 3)。
- 语句频度法:统计 “关键语句的执行次数”(每条语句执行时间基本相同,次数即代表时间),是计算复杂度的 “基础”;
- 考试常考复杂度:O (1)(常数阶,与 N 无关)、O (logN)(对数阶,如二分查找)、O (N)(线性阶,单循环)、O (NlogN)(线性对数阶,如归并排序)、O (N²)(平方阶,双循环)、O (2ⁿ)(指数阶,如递归求斐波那契),需记住 “计算逻辑 + 对应场景”。
(3)时间复杂度效率排序:避坑 “低效算法”
- 排序(从优到劣):O (1) < O (logN) < O (N) < O (NlogN) < O (N²) < O (N³) < O (2ⁿ) < O (N!)
- 核心建议:“优先选择 O (logN) 到 O (N²) 的算法,坚决回避 O (2ⁿ) 和 O (N!)”,举例说明:当 N=60 时,O (2ⁿ) 需 “2.59×10³² 个世纪”,完全无法执行,这类算法被称为 “无效算法”,考研选择题常考 “哪些是有效算法”(答案:非指数 / 阶乘级)。
(4)空间复杂度:核心考点 “原地工作”
- 定义:“程序在内存中所占的总空间”,计算公式:空间复杂度 = 程序本身空间 + 输入输出数据空间 + 辅助空间(额外申请的空间,如交换变量时的临时变量)。
- 当前趋势:计算机存储容量提升,空间复杂度考频低于时间复杂度,但 **“原地工作” 是必考点 **:
- 定义:“辅助空间相对于输入量是常量”,即 “辅助空间不随问题规模 N 增大而增加”(如排序算法中,只申请 1 个临时变量用于交换,无论 N 是 10 还是 1000,辅助空间都是 1);
- 考试判断:若选项说 “某算法原地工作”,需看 “辅助空间是否与 N 无关”,如 “冒泡排序是原地工作,归并排序不是”(归并需额外申请数组存中间结果,辅助空间随 N 增大而增加)。
- 注意点:若空间依赖 “特定输入”(如最坏情况下需更多辅助空间),则按 “最坏情况” 度量空间复杂度,如 “快速排序的空间复杂度”(最坏 O (N),平均 O (logN)),考研填空题常考 “最坏情况”。
模块 8:总结与复习建议(23:11-25:30)—— 紧扣考研复习
- 第 1 章核心回顾:强调 “算法分析” 是第 1 章的重点,需串联 “数据结构术语→算法定义 / 特点→复杂度计算”,形成知识链;
- 复习方法:“先看课时 1-4 学知识点,再看课时 5(习题课)练题,避免‘只学不练’”;建议结合教材第 1 章例题,手动计算时间复杂度(如 “单循环、双循环、特殊循环(如 while 循环)的复杂度”);
- 后续预告:下一章(第 2 章 “线性表”)将围绕 “线性表的存储结构(顺序 / 链式)与算法设计” 展开,需提前回顾 “数据结构的存储结构” 知识点,做好衔接。
1.5小结
本章介绍了数据结构的基本概念和术语,以及算法和算法时间复杂度的分析方法,主要内容如下。
(1)数据结构是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。
(2)数据结构包括两个方面的内容:数据的逻辑结构和存储结构。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。
① 逻辑结构是从具体问题中抽象出来的数学模型,从逻辑关系上描述数据,它与数据的存储无关。根据数据元素之间关系的不同特性,数据的逻辑结构通常有4 类基本逻辑结构:集合结构、线性结构、树结构和图结构。
② 存储结构是逻辑结构在计算机中的存储表示,有两类存储结构:顺序存储结构和链式存储结构。
(3)抽象数据类型是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括3 个部分:数据对象、数据对象上关系的集合,以及对数据对象的基本操作的集合。
(4)算法是为了解决某类问题而规定的一个有限长的操作序列。算法具有5 个性质:有穷性、确定性、可行性、输入和输出。一个算法的优劣应该从以下四方面来评价:正确性、可读性、健壮性和高效性。
(5)算法分析的两个主要方面是算法的时间复杂度和空间复杂度,以考察算法的时间和空间效率。一般情况下,鉴于运算空间较为充足,故将算法的时间复杂度作为分析的重点。算法执行时间的数量级称为算法的渐近时间复杂度,T(n) = O(f(n)),它表示随着问题规模 n 的增大,算法执行时间的增长率和f (n) 的增长率相同,简称时间复杂度。
学完本章后,读者应掌握数据结构相关的基本概念,包括数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构等;重点掌握数据结构所含两个层次的具体含义及其相互关系;了解抽象数据类型的定义、表示与实现方法;了解算法的特性和评价标准;重点掌握算法时间复杂度的分析方法。
1.6习题
1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
数据(Data)是信息的载体,是客观事物的符号表示,是所有能输入计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数等数值类型,文本编辑中用到的字符串,多媒体程序处理的图形、图像、声音及动画等非数值类型,它们通过特殊编码定义后的数据。
数据元素(Data Element)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录、结点等。数据元素用于完整地描述一个对象,如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等
数据项(Data Item)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象(Data Object)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N = {0, ±1, ±2, …},字母字符数据对象是集合C = {‘A’, ‘B’, … ,‘Z’, ‘a’, ‘b’, …, ‘z’},学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生基本表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。
2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两个层次的含义及相互关系。
例如,有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。每个学生的基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前驱和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。
这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。
即相同的逻辑结构,可以对应不同的存储结构。
3.简述逻辑结构的4 种基本结构并画出它们的关系图。
数据的逻辑结构有两个要素:一是数据元素;二是关系。其中,关系是指数据元素间的逻辑关系。根据数据元素之间关系的不同特性,通常有四类基本结构关系,如图 所示。它们的复杂程度依次递进。
(1)集合结构
数据元素之间除了“属于同一集合”的关系外,别无其他关系。例如,确定一名学生是否为班级成员,只需将班级看作一个集合结构。

(2)线性结构
数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,将组成一个线性结构。
(3)树结构
数据元素之间存在一对多的关系。例如,在班级的管理体系中,班长管理多个组长,每位组长管理多名组员,从而构成树结构。
(4)图结构或网状结构
数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系,任何两位同学都可以是朋友,从而构成图结构或网状结构。
其中,集合结构、树结构和图结构都属于非线性结构。
4.存储结构由哪两种基本的存储方法实现?
(1)顺序存储结构
顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
(2)链式存储结构
顺序存储结构要求所有的元素依次存放在一段连续的存储空间中,而链式存储结构无须占用一整块存储空间,但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助程序设计语言的指针类型来描述。
5.选择题
(1)在数据结构中,从逻辑上可以把数据结构分成( C )。
| A.动态结构和静态结构 | B.紧凑结构和非紧凑结构 |
|---|---|
| C.线性结构和非线性结构 | D.内部结构和外部结构 |
(2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的( C )。
| A.存储结构 | B.存储实现 |
|---|---|
| C.逻辑结构 | D.运算实现 |
(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( B )。
| A.数据具有同一特点 |
|---|
| B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 |
| C.每个数据元素都一样 |
| D.数据元素所包含的数据项的个数要相等 |
(4)以下说法正确的是( A )。
| A.数据元素是数据的最小单位 |
|---|
| B.数据项是数据的基本单位 |
| C.数据结构是带有结构的各数据项的集合 |
| D.一些表面上很不相同的数据可以有相同的逻辑结构 |
(5)算法的时间复杂度取决于( D )。
| A.问题的规模 | B.待处理数据的初态 |
|---|---|
| C.计算机的配置 | D.A 和B |
(6)以下数据结构中,( A )是非线性数据结构。
| A.树 | B.字符串 | C.队列 | D.栈 |
|---|
6.试分析下列各算法的时间复杂度。
(1)x=90; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
程序中基本语句“y--;”或“x++;”执行的次数是由x和y决定的,而x和y都是一个常数。
所以,T(n)=O(1)。
(2)for(i=0; i<n; i++)
for(j=0; j<m; j++)
a[i][j]=0;
由于程序为嵌套循环,外层循环的执行次数为n,内层循环的执行次数为m。所以,
T(n)=O(n×m)。
(3)s=0;
for(i=0; i<n; i++)
for(j=0; j<n;
s+=B[i][j];
sum=s;
由于程序为嵌套循环,外层循环的执行次数为n,内层循环的执行次数也为n。所以,
T(n)=O(n2)。
(4)i=1;
while(i<=n)
i=i*3;
设基本语句“i=i*3;”的执行次数为f(n),则3f(n)≤n。因此,T(n)=O(log3n)。
(5)x=0;
for(i=1; i<n; i++)
for(j=1; j<=n-i; j++)
x++;
基本语句“x++;”的执行次数为n−1+n−2+…+1= n(n−1)/2。因此,T(n)=O(n2)。
(6)x=n; //n>1
y=0;
while(x>=(y+1)*(y+1))
y++;
设基本语句“y++;”的执行次数为f(n),则x≥(f(n)+1)2,又由于x=n,所以f(n) ≤ n½ −1,即
T(n)=O(n½)。
参考资料:教材《数据结构 C 语言 第 3 版》 数据结构考研指导(基础篇)

浙公网安备 33010602011771号