第一章 绪论

第一章 绪论

1.1 数据结构的研究内容

计算机主要用千数值计算时, 一般要经过如下几个步骤:首先从具体问题抽象出数学模型,然后设计一个解此数学模型的算法,最后编写程序,进行测试、调试,直到解决问题,非数值计算问题无法用数学方程建立数学模型

三种数据结构

  • “线性”数据结构
  • “树”数据结构
  • “图“数据结构

举例

线性数据结构

这是线性数据结构

image-20211119151514676

这是”树“数据结构

image-20211119151602408

”图“数据结构

1.2基本概念及术语

1.2.1 数据、 数据元素、 数据项和数据对象

  • 数据->是客观事物的符号表示
  • 数据元素->是数据的基本单位
  • 数据项->是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生 基本信息表中的学号、姓名、性别等都是数据项。
  • 数据对象->是性质相同的数据元素的集合,是数据的一个子集。

1.2.2 数据结构

数据结构包括逻辑结构和存储结构两个层次

(1)逻辑结构:可看作是具体问题抽象出来的数学模型

两个基本要素:数据元素,关系(数据元素间的逻辑关系)

线性结构和非线性结构:线性结构包括线性表,栈,队列,字符串,数据,广义表;非线性结构包括树,二叉树,图

image-20211119153652230

(2)存储结构(数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构)

两种基本的存储结构:

  1. 顺序存储结构(数组)
  2. 链式存储结构(链表)

1.2.3 数据类型和抽象数据类型

(1)数据类型(是一个值的集合和定义在这个值集上的一组操作的总称)

(2)抽象数据类型(一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称)

抽象数据类型的定义格式如下:

ADT抽象数据类型名{

数据对象:<数据对象的定义>

数据关系:<数据关系的定义>

基本操作:<基本操作的定义>

}ADT抽象数据类型名

其中,数据对象和数据关系的定义采用数学符号和自然语言描述,基本操作的定义格式为:

基本操作名(参数表) 

初始条件:<初始条件描述>

操作结果:<操作结果描述>

1.3 抽象数据类型的表示与实现

以复数为例, 给出一个完整的抽象数据类型的定义、 表示和实现。

(1)定义部分

ADT Complex {
        数据对象:D={el, e2 I el, e2ER,R 是实数集}
            数据关系: S={<el,e2>1el 是复数的实部, e2 是复数的虚部}
            基本操作:
            Creat (&C, x, y)
            操作结果:构造复数C, 其实部和虚部分别被赋以参数x和y的值。
            GetReal(C)
            初始条件:复数C已存在。
            操作结果:返回复数C的实部值。
            Getimag (C)
            初始条件:复数C已存在。
            操作结果:返回复数c的虚部值。
            Add( Cl,C2)
            初始条件:Cl, C2 是复数。
            操作结果:返回两个复数 Cl和 C2 的和。
            Sub(Cl,C2)
            初始条件:Cl, C2 是复数。
            操作结果:返回两个复数 Cl 和 C2 的差。
            } ADT Complex

(2)表示部分

typedef struct//复数类型
{
	float Realpart;//实部
	float Imagepart;//虚部
}Complex;

(3)实现部分

image-20211120202832234

1.4 算法和算法分析

算法是研究数据结构的重要途径

1.4.1 算法的定义及特性

算法的五个重要特性

  1. 有穷性:算法执行有穷步,有穷时间
  2. 确定性:算法有明确的含义,不会有二义性
  3. 可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现
  4. 输入:一个算法有零个或多个输入
  5. 输出:一个算法有一个或多个输出,无输出的 算法没有任何意义

1.4.2 评价算法优劣的基本标准

  1. 正确性:在有限的运行时间内得到正确的结果。
  2. 可读性:一个好的算法,首先应便千人们理解和相互交流 , 其次才是机器可执行性
  3. 高效性:当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
  4. 健壮性:高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高, 可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时 间复杂度和空间复杂度是衡量算法的两个主要指标。

1.4.3 算法的时问复杂度

语句频度:一条语句被执行的次数

定义:一般情况下, 算法中基本语句重复执行的次数是问题规模n的某个函数j(n), 算法的时间量度记作

T(n) = O(f(n))

它 表示随问题规模n的增大, 算法执行时间的增长率 和 j(n)的增长率相同, 称做算法的
渐近时间复杂度, 简称时间复杂度

分析算法时间复杂度的基本方法为:找出所有语句中语句频度最大的那条语句作为基本语句, 计算基本语句的频度得到问题规模n的某个函数f(n), 取其数量级用符号"O"表示即可。

时间复杂度可以分为,常数阶,线性阶,平方阶,立方阶,对数阶

  • 最好时间复杂度:称算法在最好情况下的时间复杂度为,指的是算法计算量可能达到的最小值;
  • 最坏时间复杂度: 称算法在最坏情况下的时间复杂度为,指的是算法计算量可能达到的最大值;
  • 平均时间复杂度:指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。

1.4.4 算法的空问复杂度

定义:作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数, 记作: S(n) = O(f (n))

对于输入数据所占的具体存储量取决于问题本身,与算法无关,这样只需分析该算法在实现时所需要的辅助空间就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数, 则称这个算法为原地工作,辅助空间为0(1)

posted @   艾洋mhduiy  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示