基本概念和术语
数据:是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。声音数据、图像数据等
两个前提:
可以输入计算机中
能被计算机程序处理
数据元素:组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也称为记录
数据项:一个数据元素可以由若干个数据项组成
比如人这样的数据元素,可以有眼,鼻,手,脚等数据项
数据项是数据不可分的最小单位
数据对象:性质相同的数据元素的集合,是数据的子集
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合
逻辑结构和物理结构
逻辑结构:指对象中数据元素之间的相互关系
1)集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。
2)线性结构:线性结构中的数据元素之间是一对一的关系。
3)树形结构:树形结构中的数据元素之间存在一种一对多层次关系
4)图形结构:图形结构的数据元素是多对多
物理结构:指数据的逻辑结构在计算机中存储形式
1)顺序存储结构
数据元素存放在地址连续的存储单元里,其数据间逻辑关系和物理关系是一致
2)链式存储结构
数据元素存放在任意的存储单元,这组单元可以是连续的,也可以是不可连续。
抽象数据类型
数据类型:指一组的性质相同的值集合及定义在此集合上一些操作的总称。
C语言中,按照取值的不同,数据类型可以分为两类:
1)原子类型:不可以分解的基本类型,包括整型、实型、字符型等
2)结构类型:若干类型组合而成,是可以再分解的
抽象是指取出事物具有的普遍性的本质
抽象数据类型(Abstract Data Type,ADT):指一个数学模型及定义在该模型上的一组操作
ADT 抽象数据类型型名
Data
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
...
endADT
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
算法特性
1)输入输出
算法具有零个或多个输入,至少有一个或多个输出。
2)有穷性
算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步骤在可接受的时间内完成
3)确定性
算法的每一步骤都具有确定的含义,不会出现二义性
4)可行性
算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
算法设计的要求
1)正确性 2)可读性3)健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果
4)时间效率高和存储量低
算法效率的度量方法
1)事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的运行时间进行比较,从而确定算法效率的高低
2)事前分析估算方法:在计算机编制钱,一依据统计方法对算法进行估算
算法采取的策略、方法(算法好坏的)
编译产生的代码质量(软件支持)
问题的输入规模
机器执行指令的速度(硬件性能)
抛开其它因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模
输入规模的度量
一个事实:问题规模越大,算法运行时间越长。
将算法输入规模n为时间效率的参数。
把基本操作(最重要的操作)次数作为算法运行时间的度量单位。
在某个特定计算机上的某个算法程序的运行时间
T(n)≈c*C(n) c为基本操作的执行时间 C(n)为基本操作次数
算法的最优、最差和平均效率
分析非递归算法效率的通用方案
1. 决定用哪个(哪些)参数作为输入规模的度量
2. 找出算法的基本操作(作为一规律,它总是位于算法的最内层循环中)。
3.检查基本操作的执行次数是否只依赖输入规模。如果它还依赖一些其他的特性(位置等),则最差效率、平均效率以及最优效率(如果必要)需要分别研究。
4.建立一个算法基本操作执行次数的求和表达式。
5.利用求和运算的标公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长次数。
例1 考虑从n个元素的列表中查找元素最大值的问题. 假设列表是用数组实现的。
MaxElement(A[0..n-1])
//求给定数组中最大元素的值
//输入:实数数组A[0..n-1]
//输出:A中最大元素的值
maxval←A[0]
for i←1 to n-1 do
if A[i]>maxval
maxval←A[i]
return maxval
1)输入规模的度量:数组元素的个数n
2)找出算法基本操作:比较
3)检查基本操作的执行次数是否只依赖输入规模:比较次数相同
4)建立一个算法基本操作执行次数的求和表达式:
把C(n)记作比较运算的执行次数,
由于该算法每执行一次循环就会做一次比较,并且对于循环变量i在1和n-1(包含在内)中的每个值都会做一次循环,所以,我们得到C(n)的下列求和表达式:
例2 元素惟一性问题:验证给定数组中的元素是否全部惟一。
UniqueElements(A[0..n-1])
//输入:数组A[0..n-1]
//输出:如果A中的元素全部惟一,返回“true”
// 否则,返回“false”.
for i←0 to n-2 do
for j←i+1 to n-1 do
if A[i]=A[j] return false
Return true
1)输入规模的度量:数组元素的个数n
2)找出算法基本操作:比较
3)检查基本操作的执行次数是否只依赖输入规模:n?相同元素?及其位置?
最差效率:某个数组Cworst(n)所做的比较数比其它数组都多。
有哪两种类型?
不包括相同元素
最后两个元素是唯一一对相同元素
4)建立一个算法基本操作执行次数的求和表达式:
分析递归算法效率的通用方案
1)决定用哪个(哪些)参数作为输入规模的度量。
2)找出算法的基本操作。
3)检查一下,对于相同规模的不同输入,基本操作的执行次数是否不同。如果不同,则必须对最差效率、平均效率以及最优效率作单独研究。
4)对于算法基本操作的执行次数,建立一个递推关系以及相应的初始条件。
5)解这个递推式,或者至少确定它有解的增长次数。
对于任意非负整数n,计算阶乘函数F(n)=n!的值。
当n≥1时,F(n)=F(n-1)·n
且0!=1
算法 F(n)
//输入:非负整数n
if n=0 return 1
else return F(n-1)*n
用n本身来指出算法的输入规模
该算法的基本操作是乘法,它的执行次数记作M(n),思考应该如何构造表达式?
递推关系的一些求解方法
1 前向替代法
x(n)=2x(n-1)+1
x(1)=1 x(2)=3 x(3)=7 x(4)=15
找规律:x(n)=2n-1
2 反向替代法
M(n)=M(n-1)+1
=M(n-2)+1+1
=M(n-3)+1+1+1
…
=M(n-i)+i
…
=M(n-n)+n
=M(0)+n
=n
3 二阶常系数线性递推式
形式:ax(n)+bx(n-1)+cx(n-2)=f(n)
a,b,c是实数,a不为0
f(n)=0 齐次递推式
算法分析中的常见递推类型
减一法:
T(n)=T(n-1)+f(n)
减常因子:
T(n)=T(n/b)+f(n)
分治法:
T(n)=aT(n/b)+f(n)