<Data Structure>第一章 绪论部分
一、绪论
什么是数据结构
- 用计算机解决具体问题:抽象数学模型->设计->算法->编程->测试
- 数学模型:
- 数值计算类
- 线性数据结构:数据元素之间有前驱和后继关系
- 树结构:数据元素之间具有层次关系
- 图状数据结构
- 概括地说,数据结构是一门”描述现实世界实体的数学模型“的学科。
1.2基本概念和术语
-
数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。如整数、实数、声音、图像。
-
数据元素:是数据的基本单位,在计算机程序中通常作为一个整体处理(元素、记录、结点、顶点)
-
数据项:是数据的不可分割的最小单位,一个数据元素由若干数据项组成(人作为数据元素时的姓名、年龄等)
-
数据对象:性质相同的数据元素的集合,是数据的一个子集
-
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
通常有以下四类基本结构
- 集合:只有“同属一个集合”的关系
- 线性结构:数据元素存在一个对一个的关系
- 树形结构:数据元素存在一个对多个的关系
- 图状结构或网状结构:结构中的数据存在多个对多个的关系
-
数据结构的形式定义:二元组Data_Structure = (D,S),其中D是数据元素的有限集,S是D上关系的有限集
-
逻辑结构:结构定义的“关系”描述的是数据元素之间的逻辑关系
-
数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构
-
用若干位组合的位串表示一个数据元素,这个位串为元素或结点,当数据元素由若干数据项组成时,位串对应于各个数据项的子位串称为数据域
-
数据元素的物理存储由顺序映像和非顺序映像,并由此得到两个不同的存储结构:顺序存储结构和链式存储结构
-
顺序存储结构:借助元素在存储器内的相对位置来表示数据元素之间的逻辑关系
-
链式存储结构:借助指示元素存储地址的指针表示数据元素之间的逻辑关系
-
-
数据类型:出现在高级程序语言中,用以刻画(程序)操作对象的特性。数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
-
按值的不同特性,高级程序语言的数据类型可分为两类,一类是非结构的原子类型(原子类型的值是不可分解的),另一类是结构类型,结构类型的值是由若干成文按某种结构组成的,因此是可以分解的,并且它的成分可以是非结构的,可以是结构的
-
抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作,可分为以下三种类型:
-
原子类型:值是不可分解的
-
固定聚合类型:值由确定数目的成分按某种结构组成
-
可变聚合类型:与固定聚合类型相比,构成可变聚合类型值的成分的数目不确定
(后两种类型统称为结构类型)
抽象数据类型的形式表达:(D,S,P)其中D是数据对象,S是D上的关系集,P是对D的基本操作集

基本操作有两种参数,赋值参数只为操作提供输入值,引用参数以&大头,除了提供输入值外,还可以返回操作结果

-
-
多形数据类型:值的成分不确定的数据类型,但是元素之间的关系相同,基本操作也相同,所以是抽象数据类型
*1.3抽象数据类型的表示与实现
- 用到的定义
//本书用到的预定义和一些说明
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
/*数据结构的表示用类型typedef描述,数据元素类型约定为ElemType*/
/*
基本操作的算法用以下形式的函数描述
函数类型 函数名(){
//算法说明
语句序列
} //函数名
*/
-
用到的变量:
一般a,b,c,d,e等用作数据元素名,i,j,k,l,m,n用作整型变量名,p,q,r用作指针变量名,当函数返回值为函数结构状态代码时,函数定义为Status类型。打&的参数类型为引用参数
-
赋值语句:

-
选择语句
条件语句1 if(表达式) 语句; 条件语句2 if(表达式) 语句; else 语句;
-
其他

1.4算法和算法分析
1.4.1算法
算法是对特定问题求解步骤的一种描述,是指令的有限序列,每一条指令表示一个或多个操作,具有以下特性:
- 有穷性:一个算法必须总是(对任何合法输入值)执行有穷步后结束,且每一步都是有穷时间内完成
- 确定性:每一条指令必须有确切的含义,读者理解时不会产生二义性,并且任何条件下,算法只有唯一的一条执行路径,对于相同输出有唯一确定的输出
- 可行性:一个算法是可行的即算法中描述的操作都是可以通过已经实现的基本操作执行有限次来实现的
- 输入:一个算法有零个或多个输入,取自于某个特定对象的集合
- 输出:一个算法有一个或多个输出,这些输出是与同输入有着某些特定关系的量
1.4.2算法设计的要求
好的算法应该达到以下目标
-
正确性:应该分为以下四个层次
-
a.程序不含语法错误;
-
b.程序对n组输入产生正确结果;
-
c.程序对特殊输入产生正确结果;
-
d.程序对所有输入产生正确结果。
对于大型软件需要进行专业测试,而一般情况下,通常以第c层意义的正确性作为衡量一个程序是否合格的标准。
-
-
可读性:有助于人对算法的理解
-
健壮性(鲁棒性):不同输入都有相应的反应
-
效率与低存储量需求
算法的描述工具
- 自然语言
- 常需设计语言
- 流程图
- 伪码语言
- 类C
1.4.3算法效率的度量
算法执行时间需通过依据该算法编制的程序在计算机上运行时消耗的时间来度量。
- 法一:事后统计的方法:利用计算机的计时功能进行分辨优劣。这种方法有两个缺陷:
- 必须先依据算法编制程序
- 所得的时间统计量依赖于计算机的硬件和软件等环境因素
- 法二:事前分析估算的方法,分析以下因素
- a)依据的算法选用何种策略
- b)问题的规模
- c)书写程序的语言,语言级别越高,执行效率越低
- d)编译程序所产生的机器代码的质量
- e)机器执行指令的速度
撇开与计算机软硬件有关的因素,可以认为一个特定算法”运行工作量的大小“只依赖于问题的规模,或者说,他是问题规模的函数,一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(N)=O(f(n)),它表示随着问题规模n的增大,算法执行时间的增长率与f(n)相同,称为渐进时间复杂度,简称时间复杂度,时间复杂度往往取决于语句的频度(即语句重复执行的次数)

时间复杂度可能受数据集的影响,一般要么考虑平均时间复杂度(期望),当期望难以获取(大多数情况),考虑最坏情况来估算算法执行时间的一个上界
算法的存储空间需求
类似算法的时间复杂度,以空间复杂度作为算法所需存储空间的量度,记作S(n)=O(f(n)),其中n为问题规模,一个程序需要存储空间来寄存本身的指令常数、变量、输入数据以外,还需要控件存储一些计算所需信息的辅助空间,(若算法中这些额外空间相对于输入数据量来说是常数,则称为原地工作)。一般默认空间量按照最坏情况来分析。

浙公网安备 33010602011771号