1.1 数据结构讨论的范畴
著名计算机科学家、Pascal语言发明者N.沃思教授提出:
程序 = 算法 + 数据结构
程序设计:为计算机处理问题编制的一组指令集
算法:处理问题的策略
数据结构:问题的数学模型,计算机按照程序所描述的算法对某种结构的数据进行加工处理
数值计算的程序设计问题
结构静力分析计算(线性代数方程组)
全球天气预报(环流模式方程)
非数值计算的程序设计问题
求一组(n个)整数中的最大值?
计算机对弈
足协的数据库管理
书目自动检索系统
数据范畴范畴 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科
1.2 基本概念
数据与数据结构
数据:所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称
是计算机处理的信息的某种特定的符号表示形式
数据元素:数据中的一个“个体”,数据结构中讨论的基本单位
数据项:数据结构中讨论的最小单位,数据元素是数据项的集合,有时也称为域(field),即数据表中的字段
数据对象:性质相同的数据元素的集合,是数据的一个子集。如大写字母字符数据对象是集合C={A,B,C,……,Z} ,整数数据对象是集合 N = { 0, ±1, ±2,… }
例如:运动员(数据元素)
姓名
俱乐部名称
出生日期
参加日期
职务
业绩
年 月 日
**数据结构:**是指互相之间存在着一种或多种关系的数据元素的集合。数据元素之间的关系称为结构。
例如,一个含12位数的十进制数可以用三个4位的十进制表示
3214,6587,9345 — a1(3214), a2(6587), a3(9345)
在a1、a2和a3之间存在**”次序“关系**、
又例,2行3列的二维数组{a1,a2,a3,a4,a5,a6}
a1
a2
a3
a4
a5
a6
行的次序关系:
row = {,,,}
列的次序关系:
col= {,,}
再例,一维数组{a1,a2,a3,a4,a5,a6}
存在
次序关系:{|i=1,2,3,4,5}
数据的逻辑结构可归结为一下四类:
1.线性结构:一个对一个
2.树形结构:一个对多个
3.图形结构: 多个对多个
4.集合结构:数据元素,同属于一个集合
数据结构的形式定义:
数据结构是一个二元组,Data-Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
数据的逻辑结构 只抽象反映数据元素的逻辑关系
数据的存储结构 数据的逻辑结构在计算机存储器中的存储形式(或称映像)
顺序存储结构—借助元素在存储器中的***相对位置***来表示数据元素间的逻辑关系
链式存储结构—借助指示元素存储地址的***指针***表示数据元素间的逻辑关系
元素/节点 用于表示数据元素的二进制位(bit)的位串
数据域 用于表示数据项的二进制位(bit)的位串
数据结构的映像方法
用二进制位(bit)的位串表示数据元素
321 = 501 = 101000001
十进制 八进制 二进制
关系的映像方法:(表示的方法)
顺序映像 以存储位置的相邻表示后继关系
如:y的存储位置和x的存储位置之间差一个常量C
而C是一个隐含值,整个存储结构中只含数据元素本身的信息
链式映像 以附加信息(指针)表示后继关系
需要用一个和x在一起的附加信息指示y的存储位置
存储地址
存储内容
指针
1345
元素1
1400
1346
元素4
∧
……
………
…….
1400
元素2
1536
…….
………
…….
1536
元素3
1346
例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为:
typedef int Long_int[3]
数据类型 一个值的集合和定义在这个值集上一组操作的总称
例:C语言中,提供int, char, float, double等基本数据类型,数组、结构体、共用体、枚举等构造数据类型,还有指针、空(void)类型等。用户也可用typedef 自己定义数据类型
抽象数据类型(ADT) 是指一个数学模型以及定义在此数学模型上的一组操作
ADT 有两个重要特征 数据抽象 数据封装
1.3 算法和算法的衡量
算法 为了解决某类问题而规定的一个有限长的操作序列。一个算法必须满足以下五个重要特性
有穷性 对于任意一组合法输入值,在执行***有穷步骤***之后结束,即算法中的每个步骤都能在***有限时间***内完成
确定性 每条指令都有***确切***的含义,在任何条件下算法都只有一条执行路径
可行性 算法中的所有操作都必须***足够基本***,都可以通过已经实现的基本操作运算有限次实现之
有输入 有***零个或多个输入***,取自特定的对象集合
有输出 有***一个或多个输出***,是算法进行信息加工后得到的结果
算法设计的原则
正确性 在合理的数据输入下,能在有限的运算时间内得到正确结果,对算法是否“正确”的理解可以有以下四个层次:
a.程序中不含语法错误;
b.程序对于几组输入数据能够得出满足要求的结果;
c.程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果;
d.程序对于一切合法的输入数据都能得出满足要求的结果
可读性 易于人对算法的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试
健壮性 当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理
高效率与低存储量需求 通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。两者都与问题的规模有关
算法效率的衡量方法和准则
有两种衡量算法效率的方法:
事后统计法:利用计算机内记时功能,用一组或多组相同的统计数据区分。
事前分析估计法:求出算法的一个时间界限函数。
和算法执行时间相关的因素:
算法选用的策略
问题的规模
编写程序的语言
编译程序产生机器代码质量
机器执行指令速度
时间复杂度:程序运行从开始到结束所需要的时间。
设解决一个问题的规模为n,基本操作被重复执行的次数是n的一个函数f(n),假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作:
T (n) = O(f(n))
其中T(n)叫算法的渐进时间复杂度,简称时间复杂度。
算法=控制结构+原操作(固有数据类型的操作)
算法的执行时间=∑原操作(i)的执行次数╳原操作(i)执行时间
从算法中选取一种对于所研究的问题来说是基本运算的原操作,以该原操作重复执行的次数作为算法运行时间度衡量准则。
算法的存储空间需求
空间复杂度:算法所需存储空间的度量,记作:
S(n)=O(f(n))
算法的存储量包括:
(1)输入数据所占空间;
(2)程序本身所占空间;
(3)辅助变量所占空间
)]
算法的存储空间需求
空间复杂度:算法所需存储空间的度量,记作:
S(n)=O(f(n))
算法的存储量包括:
(1)输入数据所占空间;
(2)程序本身所占空间;
(3)辅助变量所占空间