抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示抽象数据类型。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合,由逻辑结构、存储结构、数据的运算组成。
数据结构的逻辑结构有线性结构(一对一)、树(一对多)以及图(多对多)。
数据结构的存储结构有顺序结构、链式结构、索引结构和散列结构。
数据的运算由运算的定义以及运算的实现构成。
算法有以下五个特性:①有穷性;②确定性;③可行性;④输入;⑤输出。
时间复杂度T(n)=O(f(n)),其计算主要关注循环体的执行次数。
例1:
int sum=;
for(int i=;i<=n;i++){
sum=sum+i;
}
i从0到n一共执行了n+1次,所以其时间复杂度为O(n).
例2:
int sum=;
for(int i=;i<=n;i=2*i){
sum=sum+i;
}
i取值1,2,4,8…,设共循环了k次,则2k<=n即k<=log2n。所以其时间复杂度为O(log2n)。
对于多个循环体,时间复杂度的计算具有加法规则和乘法规则。
例3:
int x=;
for(int i=;i<=n;i++)
x++;
for(i=;i<=n;i++)
for(int j=;j<=n;j++)
x++;
设整体的时间复杂度为T(n),第一个循环的时间复杂度为T1(n),第二个循环体的时间复杂度为T2(n)。
则T(n)=T1(n)+T2(n)=MAX{T1(n),T2(n)}=O(n2),这是时间复杂度计算的加法规则。
例4:
int sum=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j=*j){
sum=sum+j;
}
}
设整体的时间复杂度为T(n),外循环的时间复杂度为T1(n),内循环体的时间复杂度为T2(n)。
则T(n)=T1(n)*T2(n)=O(nlog2n),这是时间复杂度计算的乘法规则。
对于常见的时间复杂度,从左至右,时间性能依次降低:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)