基本概念和术语
1.数据(data):
- 所有能输入到计算机中并被计算机程序加工、处理的符号的总称。
如:整数、实数、字符、声音、图象、图形等。
2.数据元素(data element):
- 数据的基本单位。(元素、记录、结点、顶点)
在计算机程序中通常作为一个整体进行考虑和处理。
3.数据项(data item):
- 是数据的不可分割的最小单位。如:姓名、年龄等。
一个数据元素可由一个或多个数据项组成。
如: (姓名、年龄)
4.数据对象(data object):
- 由性质相同(类型相同)的数据元素组成的集合。
- 数据对象是数据的一个子集。
5.数据结构(data structure):
- 在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。
- 数据结构就是相互之间存在一种或多种特定关系的数据元素的集合。
- 按照视点不同,数据结构分为:
1. 逻辑结构 — 面向问题
2. 物理结构 — 面向计算机
数据的逻辑结构:
- 数据之间的相互关系称为逻辑结构,即从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。通常分为四类基本结构:
逻辑结构具体的分类:
数据的物理(存储)结构:
物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内
的表示(或映像),依赖于计算机。存储结构可以分为四大类:
- 1.顺序存储结构 (向量、一维数组)
- 2.非顺序存储结构(链接表、链式存储结构)
- 如单链表 其存储空间不一定连续
- 3.索引存储结构
- 除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
- 4.哈希(Hash)存储结构
- 又称散列存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的存储技术。散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。
6.数据类型(data type):
- 是一个值的集合和定义在这个值上的一组操作的总称。
(1)原子类型(如:int,char,float等)
(2)结构类型(如:数组,结构,联合体等)
7.抽象数据类型(Abstract Data Type):
- 与计算机的实现无关的数据类型。
- 形式定义:
ADT 抽象数据类型名
{ 1.数据对象;
2.数据关系:一个或多个关系;
3.一组基本操作/运算
} ADT 抽象数据类型名
- 形式定义:
算法和算法分析
算法的5个特征:
- 有穷性:在有限步(或有限时间)之后算法终止。
- 确定性:无二义性。
- 可行性:算法中的操作都是已经实现的基本运算执行有限次来实现的。
- 输入:有0或多个输入量。
- 输出:至少有一个输出量。
算法设计要求:
- 1.正确性:
- a.无语法错误;
- b.对n组输入产生正确结果;
- c.对特殊输入产生正确结果;
- d.对所有输入产生正确结果。
- 2.可读性:“算法主要是为了人的阅读与交流”。
- 3.健壮性:
- 能够对每一个输入进行合理判断,能够识别并提示非法输入
- (能够在别的编译器中运行)
注意区分 算法的五个特性 和 算法设计的三个要求
例题 :下列描述不符合算法的什么特征和要求?
- 例1
void suanfa1( )
{ int i,s=0;
for (i=0;i>=0;i++) //死循环
s++; //不能终止
}
不满足: 有穷性特征
- 例2
float suanfa2( )
{ int x,y;
scanf(“%d”, &x);
y=sqrt(x); //当x<0时,出错
return(y);
}
不满足:健壮性要求
算法的时间复杂度
- 时间频度:
- 一个算法中的原操作执行次数称为语句频度或时间频度,记为f(n)
- 时间复杂度:
- T(n) = O(f(n)) 称为算法的渐近时间复杂度,简称时间复杂度。大O(Order的缩写,意指数量级)表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
- 大O操作的本质是求f(n)的同阶无穷大。当n趋近于无穷大时,f(n)/g(n)的极限值为不等于零的常数,则称g(n)是f(n)的同数量级函数。例如,若f(n)=n(n+1)/2, 则有 1/2≤f(n)/n2≤1,故时间复杂度为T(n)=O(f(n)) = O(n2), 即T(n)与n2 数量级相同
- 常见的时间复杂度及大小比较:
时间复杂度计算有关例题
- 例1
{ int s;
scanf(“%d”,&s);
s++;
printf(“%d”,s);
}
其中:语句频度为:f(n)=3
时间复杂度为:T(n)=O(f(n))=O(3)=O(1)
O(1)称成为常量阶/常量数量级
- 例二
void sum(int a[],int n)
{ int s=0,i; // 1次
for(i=0;i<n;i++) // n次(严格为2*(n+1)次)
s=s+a[i]; // n次
printf(“%d”,s); // 1次
}
其中:语句频度为:f(n)=1+n+n+1
时间复杂度为:T(n)=O(f(n))=O(2n+2)=O(n)
O(n)称为线性阶/线性数量级
- 例三
1. void sum(int m,int n)
2. { int i,j,s=0; // 1次
3. for(i=1;i<=m;i++) // m次
4. { for(j=1;j<=n;j++) // m*n次
5. s++; // m*n次
6. printf(“%d”,s); // m次
7. }
8. }
其中
:f(m,n)=1+m+2mn+m=2mn+2m+1
当m=n时,f(n)=2n2+2n+1
T(n)=O(f(n))=O(2n2+2n+1)=O(n2)
O(n2) 称为平方阶/平方数量级
- 例四
1. void sum(int n)
2. { int i,j,s=0; // 1次
3. for(i=1;i<=n;i++) // n次
4. { for(j=1;j<=i;j++) // ?次
5. s++; // ?次
6. printf(“%d”,s); // n次
7. }
8. }
第4行的次数为 1+2+…+n=n(1+n)/2
第5行的次数为 1+2+…+n=n(1+n)/2
f(n)=1+n+n(n+1)+n=n2+3n+1
T(n)=O(f(n))=O(n2)
O(n2)称为平方阶/平方数量级
- 例五 (循环语句影响判断条件类) 常用假设-不等式判别法
1. void fun1(int n)
2. { i= 1, k=100;
3. while(i < n );
4. { k = k + 1;
5. i = i + 2;
6. }
7. }
假设while循环语句执行f(n),则
i=2f(n)+1 < n 推出 f(n)<=n/2 -1 (与循环条件关联)
故时间复杂度为 O(n)
- 例六
1. void fun2(int n)
2. { i= 1, s= 0;
3. while(s < n )
4. { i++;
5. s = s + i;
6. }
7. }
假设while循环语句执行f(n),则
s=1+2+…+f(n) < n
推出 T(n)=O(f(n))= O(n0.5)
- 例六
int count = 1;
while (count < n)
{
count = count * 2;
}
假设赋值语句执行x次,则
2x<n<2x+1
推出T(n)=O(log n) 称为对数阶/对数数量级
算法的空间复杂度
- 一个算法在计算机存储器上所占用的存储空间,包括:
(1) 存储算法本身所占用的存储空间;
(2) 算法的输入输出数据所占用的存储空间;
(3) 算法在运行过程中临时占用的存储空间。
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。