《数据结构》(C语言版)学习笔记—— 第1章 绪论
数据结构的研究内容
数据 结构主要研究非数值计算问题,非数值计算问题的数学模型不再是数学方程,而是诸如线性表、 树和图的数据结构。因此,简单地说,数据结构是一门研究非数值计算程序设计中的操作对象, 以及这些对象之间的关系和操作的学科。
基本概念和术语
数据、数据元素、数据项和数据对象
- 数据 (Data) 是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号 的总称。如数学计算中用到的整数和实数,文本编辑中用到的字符串,多媒体程序处理的图形、 图像、声音及动画等通过特殊编码定义后的数据。
- 数据元素(Data Element)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。 在有些情况下,数据元素也称为元素、记录等。数据元素用千完整地描述一个对象,如前一节示 例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。
- 数据项 (Data Item) 是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生 基本信息表中的学号、姓名、性别等都是数据项。
- 数据对象 (Data Object) 是性质相同的数据元素的集合,是数据的一个子集。例如:整数数 据对象是集合N= {O, 士1' 士2,…}, 字母字符数据对象是集合C= {'A','B', …,'Z','a','b', …, 'z'}, 学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如 整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表) 的集合, 只要集合内元素的性质均相同,都可称之为一个数据对象。
数据结构
数据结构(Data Structure)是相互之间存在的一种或者多种特定元素的数据元素的集合。
数据结构包括逻辑结构和存储结构两个层次。
逻辑结构
要素: 一是数据元素;二是关系。
- 集合结构
数据元素之间除了“属于同一集合”的关系外,别无其他关系。 - 线性结构
数据元素之间存在一对一的关系。 - 树结构
数据元素之间存在一对多的关系。 - 图结构或网状结构
数据元素之间存在多对多的关系。
存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构
- 顺序存储结构
顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助 程序设计语言的数组类型来描述。 - 链式存储结构
顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占 用一整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段,用千存放后继 元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述。
数据类型和抽象数据类型
数据类型
数据类型(Data Type)是一个值的集合和定义在这个值集上的一组操作的总称。
抽象数据类型
抽象数据类型 (Abstract Data Type, ADT) 一般指由用户定义的、表示应用问题的数学模型, 6 l第1章 绪论1 以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合 以及对数据对象的基本操作的集合。
抽象数据类型的表示与实现
抽象数据类型的概念与面向对象方法的思想是一致的。抽象数据类型独立于具体实现,将数 据和操作封装在一起,使得用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据, 从而实现了信息隐藏。
抽象数据类型相当千在 概念层(或称为抽象层) 上描述问题,而类相当于在实现层上描述问题。
算法与算法分析
算法的定义及特性
算法(Algorithm)是为了解决某类问题而规定的一个有限长的操作序列。
特性:
- 有穷性。
- 确定性。
- 可行性。
- 输入。
- 输出。
评价算法优劣的基本标准
- 正确性
- 可读性
- 健壮性
- 高效性
算法的时间复杂度
问题规模与语句频度
问题规模 是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。
一个算法的执行时间大致上等千其所有语句执行时间的总和, 而语句的执行时间则为该条语 句的重复执行次数 和执行一次所需时间的乘积。
一条语句的重复执行次数称作语句频度(Frequency Count)。
算法的时间复杂度
一般情况下, 算法中基本语句重复执行的次数是问题规模n的某个函数f(n), 算法的时间量 度 记作
T(n) = O(f(n))
它 表示随问题规模n的增大, 算法执行时间的增长率 和 f(n)的增长率相同, 称做算法的 渐近时间复杂度, 简称时间复杂度(Time Complexity)。
数学符号"O" 的严格定义为: 若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)= O(f(n)表示存在正的常数C和n。, 使得当n>=n。时都满足0<=T(n)<=Cf(n)。
算法的时间复杂度分析举例
-
常量阶
{x++;s=0}
两条语句频度均为1' 算法的执行时间是一个与问题规模n无关的常数, 所以算法的时间复 杂度为T(n) = O(1), 称为常量阶。 -
线性阶
for(i=0;i<n;i++){x++;s=0;}
循环体内两条基本语句的频度均为f{n) =n, 所以算法的时间复杂度为T(n) = O(n), 称为线 性阶。 -
平方阶
x=0;y=0; for(k=1;k<=n;k++) x++; for(i=1;i<=n;i++) for(j=1;j<=n;j++) y++;
对循环语句只需考虑循环体中语句的执行次数, 以上程序段中频度最大的语句是(6), 其频度为f(n) = n^2 , 所以该算法的时间复杂度为T(n) = O(n^2), 称为平方阶。 多数情况下, 当有若干个循环语句时, 算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的。
-
立方阶
x=1; for(i=;i<=n;i++) for(j=;j<=i;j++) for(k=;k<=j;k++) x++;
显见, 该程序段中频度最大的语句是(5), 这条最深层循环内的基本语句的频度,依赖千各层 循环变量的取值,由内向外可分析出语句(5)的执行次数为:
- 对数阶
for(i=1;i<=n;i=i*2){x++;s=0;}
一般情况下,随着 n 的增大, T(n)的增长较慢的算法为较优的算法。
最好、最坏和平均时间复杂度
称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值; 称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;算 法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的 加权平均值。
算法的空间复杂度
关千算法的存储空间需求,类似千算法的时间复杂度,我们采用渐近空间复杂度(Space Complexity)作为算法所需存储空间的扯度,简称空间复杂度,它也是问题规模n的函数, 记作:
S(n) = O(f (n))
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)