一、抽象数据类型=逻辑结构+抽象运算
ADT <抽象数据类型名> { 数据对象:<数据对象的定义> 数据关系: <数据关系的定义> 基本操作: <基本操作的定义> } (其中数据对象和数据关系就是逻辑结构,基本操作就是抽象运算)抽象数据类型中对数据对象和数据运算的声明,将对数据对象的表示和数据运算的实现分离。
二、抽象数据类型的两个重要特征
- 数据抽象
用ADT描述程序处理的实体时,强调的是其本质特征,其所能完成的功能,以及他和外部用户的接口 - 数据封装
将实体的外部特征和内部实现细节分离,并对外部用户隐藏其内部实现细节
三、算法
在具体存储结构上实现某个抽象运算。或者可以定义为,对特定问题求解方法的一种描述,是指令的优先序列,其中每一条指令表示一个或多个操作
(1)算法的重要特性
- 有穷性:在有穷步之后结束
- 确定性:无二义性
- 可行性:可通过基本运算有限次执行来实现
- 有输入
- 有输出
(2)算法与程序的区别
- 一个计算机程序是对一个算法使用某种程序设计语言的具体实现
- 算法必须可终止,意味着不是所有的计算机程序都是算法(比如说一段程序可以是死循环,那么这个死循环是一个计算机程序,但不是一个算法)
程序1:违反了算法的可行性
void exam1()
{
int x,y:
y=0:
x=5/y:
printf("%d,%d\n",x,y);
}
程序2:违反了算法的有穷性
void exam2()
{
int n=2;
while(n%2==0)
n=n+2;
printf("%d\n",n);
}
(3)评价算法的指标
- 正确性(Correctness):应该满足具体问题的需求
- 可读性(Readability):应容易供人阅读和交流,可读性好的算法有助于对算法的理解和修改
- 健壮性:具有容错处理。当输入非法或错误数据时,算法应能适当的做出反应或进行处理,而不会产生其他错误结果
- 通用性:应具有一般性,即算法的处理结果对于一般的数据集合都成立
- 效率与存储量需求:效率指的是算法执行的时间;存储量需求算法执行过程中所需要的最大存储空间。而这与问题的规模有关
四、例子
程序设计语言表示算法:读入两个整数x、y,要求交换它们的值(程序2、3可以将两变量的值成功交换)
程序1(传值):这个交换的是形式参数,并不是变量本身
void swap1(int x,int y)
{
int tmp;
temp=x;
x=y;
y=temp;
}
程序2(传递指针):x和y的指针分别指向不同变量的值
void swap2(int *x,int *y)
{
int tmp;
temp=*x;
*x=*y;
*y=temp;
}
程序3(传引用):x和y的分别指向不同变量的引用
void swap3(int &x,int &y)
{
int tmp;
temp=x;
x=y;
y=temp;
}
五、算法复杂度
- 效率:单位时间完成的工作量
- 算法的效率:有效的使用计算资源满足需求
时:用时短(CPU的计算资源) 空:耗费内存少(存储资源)
注:用时短的算法不一定是好算法,因为程序执行的环境不同、实现语言等其他因素也有影响
(1)用基本运算的次数度量算法的时间复杂度
-
算法的构成:一个算法是由控制结构(顺序、分支和循环)和原操作(固有数据类型的操作,如比较、加减乘除等)构成;算法时间取决于二者的综合效果。 a.从算法中选取一种对于所研究的问题来说是基本运算的原操作(简称为基本运算) b.算法执行时间大致为基本运算所需的时间与其运算次数的乘积 c.基本运算的一般是最深层循环内的语句
(2)算法的时间复杂度
- 原理:在一个算法中,进行基本运算的次数越少,其运行时间也就相对的越少;反之亦然
- 定义:把算法中包含基本运算次数的多少称为算法的时间复杂度,即一个算法的时间复杂度是指该算法的基本运算次数
- 度量:算法中基本运算次数T(n)是问题规模n的某个函数f(n),记作:T(n)=O(f(n))
(3)算法的时间复杂度的表示法
- ”O“:表示时间复杂度的”量级“;随问题规模n的增大,算法的执行时间增长率和f(n)的增长率相同
- ”O“的形式定义:若f(n)是正整数n的一个函数,存在一个正常数C和n_0,使得当n>=n_0时,有T(n)<=C*f(n),则记T(n)=O(f(n)),实质是当n趋于无穷大时,T(n)/f(n)=C
- 例子:T(n)=3(n2)-5n+10000=O(n2),指定正常数C=3,当n>2000时,有3(n2)-5n+10000<3(n2),只求出T(n的最高阶,忽略其低阶项和常系数,这样既可简化T(n)的计算,又能客观的反映出当n增长到很大时算法的是时间性能;算法只关心n很大时的结果。
(4)复杂度的量级 O(1)<O(log2(n))<O(n)<O(nlog2(n))<O(n2)<O(n3)<O(2n)<O(n!)
六、算法的空间复杂度
- 空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的量度
- 空间复杂度一般也作为问题规模n的函数,以数量级形式给出,记作:S(n)=O(g(n))
七、程序=数据结构+算法
程序就是在数据的某些特定的表示方法和结构的基础上,对抽象算法的具体表达
|