第1章 绪论

第1章 绪论

1.1 数据结构的研究内容

1.1.1 课程章节与板块划分

本课程教材的 8 个章节:第 1 章绪论、第 2 章线性表、第 3 章栈和队列、第 4 章串 / 数组 / 广义表、第 5 章树和二叉树、第 6 章图、第 7 章查找、第 8 章排序。

结合讲课内容,这些章节被划分为 4 个独立学习板块:

  1. 引入板块:对应第 1 章(绪论)

    作用:介绍数据结构的基本概念与定位,帮你建立对课程的整体认知(讲课核心:“告诉同学们数据结构这门课程到底是一门什么样的课程”)。

  2. 核心板块:对应第 2、3、5、6 章

    作用:覆盖 “现实中四类问题” 的解决方案,是数据结构的核心(考研 / 面试 / 考试的重点板块,讲课核心:“解决我们所有的难的和简单的复杂问题的具体的结构”)。

  3. 扩展板块:对应第 4 章(串、数组、广义表)

    作用:补充 3 种特殊数据结构,拓展数据结构的应用场景(讲课称其为 “扩展章”)。

  4. 应用板块:对应第 7、8 章(查找、排序)

    作用:将前序学习的结构用于实际高频场景(讲课中 “硬应用的板块” 实际是解决身边问题的应用板块)。

1.1.2 课程授课方法、学习内容与目标

课件图 2 明确了课程的授课方法、学习内容与目标:

  1. 授课方法:两篇法(基础 + 提升)对应讲课的 “两遍教学法”(整本书分两轮学习,非每章讲两遍):

    • 基础篇:核心是 “概念 + 算法思想”工具:纸 + 笔(无需电脑)

      学习方法:画(画数据结构的逻辑、流程)

      效果:能用自然语言描述算法思想(考研 / 面试中能得 1/3 以上分数,讲课核心:“拿来一个问题,我可能写不出代码,但知道怎么解”)。

    • 提升篇:核心是 “算法 + 习题”

      工具:电脑

      学习方法:编 + 分析(跟着写代码、拆解逻辑)

      效果:从 “懂思路” 提升到 “能编码实现”。

  2. 学习内容:三大核心

    对应讲课的 “数据结构定义”:数据结构 = 逻辑结构 + 存储结构 + 算法思想 / 实现

    • 逻辑结构:数据之间的关系(如 “线性”“树形”);
    • 存储结构:数据在计算机中的存储方式(如 “顺序存储”“链式存储”);
    • 算法思想 / 实现:基于前两者的问题解决步骤与代码落地。
  3. 目标:掌握数据结构

    既用于考试(考出对应成绩),也用于后续课程、面试的实际问题解决(讲课核心目标)。

1.1.3 第 1 章 绪论的小节

课件图 3 列出本章 4 个小节:1.1 数据结构的研究内容、1.2 基本概念和术语、1.3 抽象数据类型的表示与实现、1.4 算法与算法分析。

结合讲课内容,本章实际核心学习点是 2 个:

  1. 数据结构基础术语:对应 1.2 小节,考分占比低,以记忆为主;
  2. 算法时间复杂度分析:对应 1.4 小节,是考研 / 面试必考计算题,需掌握计算方法(讲课核心:“这是有一个计算题出现的”)。

1.1.4 数据结构的研究内容

“引论” 的 3 个核心内容,结合讲课补充说明:

  1. 任务解决原则:计算机通用流程

    需求分析 → 总体设计 → 模块分割 → 建立数学模型 → 设计算法 → 程序编制 → 调试 → 结果
    

    补充:这是计算机专业解决所有问题的通用逻辑,而数据结构是流程的 “入口”

    —— 通过提炼问题中的 “数据” 和 “数据关系”,帮助建立数学模型、设计对应算法(对应人工智能逻辑:“数据源决定算法”)。

  2. 数据结构涉及的内容:“数学模型的建立和对该模型具体实现的对应的算法”

    补充:数据结构是 “问题” 与 “算法实现” 的桥梁,核心是分析数据及关系,进而落地为可执行的算法。

  3. 数据结构的地位:“数学、硬件、软件之间。核心专业基础课”

    • 定位:计算机专业 “主轨道课 / 四大王牌课之一”,衔接数学(理论)、硬件(存储)、软件(实现);
    • 学习门槛:并非大学专属 —— 优质学校的小学 / 初中已开设基础内容,跟着 “画 + 编” 的方法即可掌握。

1.2 数据结构的基本概念和术语

1.2.1 基本术语

课上重点讲解 4 个核心术语(考试高频考点),并结合通讯录例子辅助理解:

  1. 数据
    • 定义:能输入到计算机中并被处理的符号集合(数字、字符、声音、图形等)。
    • 补充:存放到计算机里的内容才叫 “数据”,未存入的称为 “信息”。
  2. 数据元素
    • 定义:数据的基本单位,计算机中作为一个整体处理(考试填空 / 选择重点)。
    • 例子(通讯录):通讯录的每一行(如 “赵海英 + 年龄 + 地址”)是一个数据元素,本例子中 “赵海英、张三、李四” 对应 3 个数据元素。
    • 考试技巧:“行为元素”
  3. 数据项
    • 定义:数据不可分割的最小单位(考试填空 / 选择重点)。
    • 例子(通讯录):通讯录的每一列(如 “姓名”“年龄”“地址”),拆分后不再承载完整信息(如年龄 “28” 拆分无意义)。
    • 考试技巧:“列为项”;区分:最小单位是数据项,基本单位是数据元素。
  4. 数据对象
    • 定义:性质相同的数据元素的集合(数据的子集)。
    • 例子(通讯录):“赵海英、张三、李四” 这 3 个数据元素的集合。

1.2.2 数据结构

(1)数据结构的定义

  • 书上定义 1:相互之间存在一种或多种特定关系的数据元素的集合(注意:是数据元素的集合,非数据项的集合)。

  • 书上定义 2:按逻辑关系组织的一批数据,以一定存储方法存于计算机,并定义了运算的集合。

  • 核心定义(考试答题满分表述):

    数据结构 = 逻辑结构 + 存储结构(物理结构) + 操作(算法)

(2)数据结构的性质划分

  • 数据的逻辑结构
    • 定义:数据元素之间的逻辑关系(是问题的 “数学模型”,用于设计算法)。
    • 补充:从问题中提炼数据和关系后画出的结构,每个问题的逻辑结构是唯一的
  • 数据的物理结构(存储结构)
    • 定义:数据结构在计算机中的映像(是算法的 “实现载体”)。
    • 补充:计算机内存是线性的,需将逻辑结构转化为存储结构;逻辑结构唯一,但存储结构可选择,不同选择会直接影响算法效率。

1.2.3 四种逻辑结构

定义:根据数据元素的关系分类(共 4 类),用于区分问题的难易程度。

  1. 集合
    • 关系:数据元素仅属于同一集合,无其他关系(关系为 “0”)。
    • 类比:数学中的集合(画圈包含元素),操作如交、并等。
  2. 线性结构
    • 关系:数据元素间是 “一对一” 关系,有序列 / 相邻关系(属于简单问题)。
    • 例子(老师举例):通讯录中 “赵海英→张三→李四”,仅相邻元素有一对一关系,属于线性结构。
  3. 树型结构
    • 关系:数据元素间是 “一对多” 关系,有层次关系(属于复杂问题)。
    • 例子(老师举例:学校管理):校长→各学院→各系→各专业(如 “校长→艺术传媒学院→技术系→新媒体专业”),是 “倒立的树”,属于树型结构。
  4. 图状结构(网状结构)
    • 关系:数据元素间是 “多对多” 关系,关系具有任意性(属于复杂问题)。
  • 考试分类:
    • 线性结构:集合、线性结构(简单问题)。
    • 非线性结构:树型结构、图状结构(复杂问题)。

1.2.4 四种存储结构

定义:将逻辑结构转化为计算机可存储的形式(共 4 类),可根据效率需求选择。

  1. 顺序存储结构:按内存地址连续存储的方式。
  2. 链接存储结构:不连续的内存存储方式。
  3. 索引存储结构:存储结点时建立附加索引表,索引项形式为 “关键字 + 地址”(类比字典的索引)。
  4. 散列存储结构(哈希存储):根据结点的关键字直接计算存储地址(特点:高效检索)。

老师强调:同一问题的逻辑结构唯一,但可选择不同存储结构;存储结构的选择会影响算法的效率(如互联网场景的实时响应速度)。

1.3抽象数据类型 ——ADT

1.3.1 ADT 的核心定位

  1. 术语定义:ADT 是 “抽象数据类型(Abstract Data Type)” 的缩写,是数据结构课程的核心术语,需牢记。
  2. 本质属性:ADT 是一种思维方式—— 不依赖具体编程语言实现,仅描述应用问题的数学模型及操作逻辑,部分高校会在未开设编程语言课程前讲授(因为其本身是 “抽象的解决思路”)。

1.3.2 ADT 的定义

定义:由用户定义、表示应用问题的数学模型,包含三部分:数据对象、数据对象上的关系集合、数据对象的基本操作集合。

解释:ADT 是 “三要素组合体”—— 解决任何问题时,必须明确 3 件事:①有哪些数据(数据对象);②数据之间是什么关联(数据关系);③能对数据做哪些操作,这三者结合才是完整的 ADT。

1.3.3 ADT 的定义格式(对应课件 “定义格式” 板块)

课件给出的形式化格式:

ADT 抽象数据类型名{
  数据对象:<数据对象的定义>
  数据关系:<数据关系的定义>
  基本操作:<基本操作的定义>
}ADT 抽象数据类型名

说明:这里的 “抽象数据类型名” 是 “类型”(而非具体变量),类似 C/C++ 中的intfloat是 “类型”,不是单个变量。

1.3.4 ADT 的三要素

ADT 的核心是 “数据对象、数据关系、基本操作”,缺一不可:

  1. 数据对象:数据元素的集合(比如 “所有整数” 是int类型的数据对象)。
  2. 数据关系:数据元素之间的关联方式(比如整数的 “大小顺序” 是int的数据关系)。
  3. 基本操作:可对数据执行的操作(比如整数的 “加减乘除取余” 是int的基本操作)。

1.3.5 ADT 与普通数据类型的关系

  1. 核心联系:编程语言中的普通数据类型(如 C/C++ 的intfloat),是已实现的 ADT—— 普通数据类型也包含 “数据对象、数据关系、基本操作” 三要素。
  2. 关键区别
    • ADT:是 “未实现的思维描述”,仅定义三要素。
    • 普通数据类型:是 ADT 的具体实现(依赖编程语言的语法、存储规则)。
  3. 详细例子(老师课上讲解)
    • 例 1:C 语言中 2 字节的int类型
      • 数据对象:2 字节(16 位)存储的整数,最高位为符号位,数据位共 15 位,范围是-2¹⁵ ~ 2¹⁵-1
      • 数据关系:整数的有序(大小)关系。
      • 基本操作:加减乘除、取余等运算。
    • 例 2:float类型
      • 数据对象:单精度(4 字节)/ 双精度(8 字节)存储的浮点数,有对应的数值范围限制。
      • 数据关系:浮点数的大小顺序关系。
      • 基本操作:浮点加减乘除等运算。

1.3.6 总结

数据结构中的 ADT 是 “形式化的三要素描述”,编程语言中的数据类型是 “ADT 的具体实现”,二者的核心逻辑都是 “数据对象 + 数据关系 + 基本操作” 的组合体。

1.4 算法和算法分析

1.4.1 算法

定义:指一系列确定的、且在有限步骤内能完成的操作。

补充:可简化理解为 “一系列有限步骤”(举例:炒鸡蛋西红柿是算法 —— 有限步骤能完成整个烹饪过程)。

1.4.2 算法的特点

5 个特点,整合为4 个考试核心考点

  1. 有穷性:能在有限步骤内执行结束
    • 强调:算法必须有穷,但程序可以有无穷性(如工厂安检程序需日夜运行,是合理的无穷性程序)。
  2. 确定性:对于相同的输入,执行相同的路径
    • 提示:考试中不要选 “正确性”,要选 “确定性”(类比:炒菜步骤不确定则无法执行)。
  3. 有效性(可行性):描述算法的操作都是足够基本、可执行的。
  4. 输入输出:
    • 输入:0 至多个(可自动生成数据,无需用户输入);
    • 输出:1 至多个(无输出的程序无实际价值)。

1.4.3 算法与数据结构的关系

计算机科学家沃斯(N.Wirth)提出:“算法 + 数据结构 = 程序”,二者互相依赖、关联:

  • 算法建立在数据结构上;
  • 算法不确定则无法构造数据。

扩展

  • 算法≠程序:算法必须有穷,程序可有无穷性(如日夜运行的安检程序)。
  • 核心逻辑:问题固定时,逻辑结构固定,但存储结构可选择;合适的存储结构能大幅提升算法效率。

1.4.4 算法与数据结构关系举例

  • 顺序存储:按姓名顺序存,依次查找(若数据量上亿,效率极低);
  • 索引存储:建立姓氏索引表,仅查对应姓氏区域,效率大幅提升。

补充

  • 数据项:数据结构的最小单位(如 “姓名”“Tel”);
  • 数据元素:数据结构的基本单位(一行 “姓名 + Tel”);
  • 存储结构选择:存储结构有 4 种(顺序、链式、索引、散列),此例选索引存储(类比字典查单词:先按首字母定位区域)可提升效率。

1.4.5 算法设计的要求

1.4.6 时间复杂度

  • 时间复杂度是事前估计值,不依赖实际计算机性能,仅与问题规模n相关(不是实际运行的 “掐表时间”)。
  • 表示方法:
    1. 大 O 法T(n)=O(f(n)),表示执行时间的增长率与f(n)相同(取近似值,砍掉常数项、系数);
    2. 语句频度法:计算语句重复执行的次数(准确值)。

1.4.7 引例与分析

  1. 代码:++x; s=0;
    • 语句频度:++x频度为 1,s=0频度为 1;
    • 大 O 复杂度:O(1)(与n无关)。
  2. 代码:for(i=1; i<=n; ++i) {++x; s+=x;}
    • for 循环执行逻辑:
      • 初始化i=1:频度 1;
      • 判断i<=n:频度n+1(n次真、1 次假);
      • 循环体++xs+=x++i:频度均为n
    • ++x频度:n
    • 大 O 复杂度:O(n)。
  3. 代码:双重 for 循环
    • 外循环n次、内循环n次,循环体++x频度:n×n=n2
    • 大 O 复杂度:O(n2)。

1.4.8 时间复杂度与运行时间的关系

  • 有效算法f(n)为对数、幂函数或其乘积(运行时间可接受);
  • 无效算法f(n)为指数、阶乘函数(运行时间不可接受);
  • 增长速度:对数函数<幂函数<指数函数。

1.4.9 常见函数的增长率

增长率由慢到快的顺序:

O(1)(常量阶)< O(logn)(log n 阶)< O(n)(n 阶)< O(nlogn)(n log n 阶)< O(n2)(平方阶)< O(n3)(立方阶)< O(2n)(指数阶)

提示:尽量少用指数阶算法。

1.4.10 空间复杂度

定义:算法所需存储空间的度量。

1.5习题

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 版》 数据结构考研指导(基础篇) 、数据结构考研指导(基础篇) 视频课程|赵海英

posted @ 2025-12-03 19:28  CodeMagicianT  阅读(16)  评论(0)    收藏  举报