第一章绪论
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章绪论
1.1什么是数据结构
现实世界的问题-→抽象-→数学模型
数值计算问题数学方程
人口增长预测
应力应变分析
化学反应分析
非数值计算问题数据结构
例一:图书馆的自动书目检索系统
例二:井字格棋---传达命令、一个学院的组织形式
例三:交通灯问题—进行拓扑排序计算工期,或者求最短路径
1.2基本概念和术语
▪是信息的载体,是描述客观事物的符号表示,它能够被计算机识别、存储和加工处理,也就是说数据
是能有效的输入到计算机中,并能被计算机程序识别和处理的符号的集合。
●数值性数据
●非数值性数据
●数据的基本单位。在计算机程序中常作为一个整体进行考虑和处理。
●数据元素由若干数据项(Data Item)组成。数据项是具有独立含义的最小标识单位。
●数据元素又称为元素、结点、记录
3、
是具有独立含义的、不可分割的数据最小单位,有时也称作域字段等。
•具有相同性质的数据元素的集合。是数据的一个子集
整数数据对象
N = { 0, ±1, ±2, … } 字母字符数据对象
C={ ‘A’, ‘B’, ‘C’, … ‘F’ }又如:例四的表就是一个数据对象
是相互之间存在一种或多种特定关系的数据元素的集合。换句话说数据结构就是指数据元素和数据元素关系的集合,数据元素间的相互关系具体应该包括三各方面:数据的逻辑结构,数据的存储结构以及数据的运算集合。
也就是知如何用计算机语言表示节点之间的各种关系
注:在无一起混乱的前提下,把数据的逻辑结构简称为数据结构,数据的存储结构简称为存储结构。 下面我们来分别了解一下数据结构的这三个方面
●
数据的逻辑结构于数据的存储无关,是独立于计算机的。
根据数据元素间关系的不同特征,通常有四种基本结构:
✓ 存在关系,因此我们这门课对于集合不再讨论。
✓
举例:学生名单
✓ 举例:学院的组织形式
✓
✓
网又叫带权值的图
•树形结构和网状结构又称为非线性结构
•数据的逻辑结构的形式定义:
某一数据对象的所有数据成员之间的关系。记为:
Data_Structure = {D, S}
其中,D 是某一数据对象, S
是该对象中所有数据成员之间的关系的有限集合。
● 数据的存储结构是指数据的逻辑结构在计算机存储器里的表示方式,又称为“物理结构”。它是依赖于计算机的
•顺序存储结构——借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
•链式存储结构——借助指示元素存储地址的指针表示数据元素间的逻辑关系
常用的数据运算包括:查找、删除、修改、插入、检索、排序等等。
数据类型的分类:•原子类型:值不可再分解(基本类型)
•结构类型:值可再分解(构造类型)
•例2 在C 语言中
原子类型:整型、浮点型、字符型、双精度型、空类型、指针、枚举型
结构类型:数组、结构、联合、自定义
是指一个逻辑概念上的类型(数学模型)和这个类型上的一组操作的集合
例如:矩阵 +(求转置、加、乘、求逆、求特征值)构成一个矩阵的抽象数据类型
抽象数据类型可用(D,S,P)三元组表示
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
ADT 抽象数据类型名 {
数据对象:〈数据对象的定义〉
数据关系:〈数据关系的定义〉
基本操作:〈基本操作的定义〉
} ADT 抽象数据类型名
其中,数据对象、数据关系用伪码描述;
基本操作名(参数表)
初始条件:〈初始条件描述〉
操作结果:〈操作结果描述〉
•基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。
•“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。
•“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。
1.4算法和算法分析
所谓算法是指对特定问题求解方法和步骤的一种描述,它是指令的一组有限序列,其中每一条指令表示一个或多个操作。
算法具有以下五个特性:
1)输入一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
2)输出一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
3)有穷性一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
4)确定性算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口。
5)可行性一个算法是可行的。即算法描述的操作都是可以通过已经实现的基本运算执行有限次来实现
1.4.2 算法设计的要求
评价一个好的算法有以下几个标准:
(1) 正确性(Correctness ) 算法应满足具体问题的需求。
(2)可读性(Readability) 算法应该好读。以有利于阅读者对程序的理解。
(3)健状性(Robustness) 对于一些非法的数据,算法应具有容错处理。
(4)效率与存储量需求效率指的是算法执行的时间;存储量需求指算法执行过程中所需要最大存储空间。
(5)可修改可扩展性
1.4.3 算法时间效率的度量
缺陷
•必须先运行依据算法编制的程序,这通常都是比较麻烦的
‚所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣
用数学的方法直接对算法的效率进行分析。
一个高级语言程序在计算机上运行所消耗的时间与下面这些因素有关:
•依据的算法选用何种策略
ƒ程序语言(高级语言都是要经过编译之后转换为计算机可以是别的目标代码,语言的级别越高,转换效率就越低)
…编译程序产生机器代码质量
语句执行一次所需时间取决于机器的指令性能和速度和编译所产生的代码质量,很难确定。———所以使用绝对时间单位衡量算法效率不合适,因此认为语句执行一次时间为单位时间1,则一个算法的运行时间就是该算法中所有语句的频度之和
T(n)=O(f(n))
T(n) 该算法中所有语句的频度之和,即一个算法的运行时间
他表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同称作算法的渐近时间复杂度。总结的一些相关的法则:
例1 {++x;s=0;}
将x自增看成是基本操作,则语句频度为1,即时间复杂度为O(1)
如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为O(1),即常量阶。
例2、for(I=1;I<=n;++I)
{++x;s+=x;}
语句频度为:2n 其时间复杂度为:O(n)即时间复杂度为线性阶
例3、for(I=1;I<=n;++I)
for(j=1;j<=n;++j)
{++x;s+=x;}
语句频度为:2n2 其时间复杂度为:O(n2) 即时间复杂度为平方阶。
定理:若A(n)=a m n m +a m-1 n m-1+…+a1n+a0是一个m次多项式,则A(n)=O(n m) 证略。
例4for(i=2;i<=n;++I)
for(j=2;j<=i-1;++j)
{++x;a[i,j]=x;} 语句频度为:
1+2+3+…+n-2=(1+n-2) ×(n-2)/2
=(n-1)(n-2)/2
=n2-3n+2