数据结构
- 逻辑结构:集合、线性结构、树形结构、图状结构
- 存储结构:顺序结构、链式结构、索引结构、散列结构
算法分析
1.时间复杂度
算法的时间复杂度
- 定理:若基本语句重复执行次数f(n)=annm+am-1nm-1+…+a1n+a0是m次多项式,则T(n)=O(nm)
- 基本方法:
1.找出语句频度(语句执行次数)最大的那条语句作为基本语句
2.计算基本语句的频度得到问题规模n的某个函数f(n)
3.取其数量级用“O”表示 - 注意点:
1.时间复杂度由嵌套最深层语句频度决定
2.有时候采用求和方式计算 - 举例说明
【经典例题1】
for(i=1;i<n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x=x+1;//基本语句
T(n)=
∑
i
=
1
n
\sum_{i=1}^n
∑i=1n
∑
j
=
1
i
\sum_{j=1}^i
∑j=1i
∑
k
=
1
j
\sum_{k=1}^{j}
∑k=1j 1=
∑
i
=
1
n
\sum_{i=1}^n
∑i=1n
∑
j
=
1
i
\sum_{j=1}^i
∑j=1ij=
∑
i
=
1
n
\sum_{i=1}^n
∑i=1ni(i+1)/2
数学公式计算
【经典例题2】
i=1;
while(i<=n)
i=i*2;
若循环执行1次:i=1 * 2=2;
若循环执行2次:i=2 * 2=22;
若循环执行3次:i=2 * 2 * 2=23;
……
若循环执行x次:i=2x;
i<=n
2x<=n
x<=log2n
有T(n)=O(log2n)
时间复杂度的分类
- 最坏时间复杂度
- 平均时间复杂度
- 最好时间复杂度
时间复杂度计算规则
- 加法规则:T(n) = T1(n) + T2(n) = o( f(n) ) + o( g(n) ) = o( max{f(n),g(n)} )
- 乘法规则:T(n) = T1(n) * T2(n) = o( f(n) ) * o( g(n) ) = o( f(n) * g(n) )
2.渐进空间复杂度
- 空间复杂度:算法所需存储空间的度量s(n)=O(f(n)),其中n为问题规模
- 算法占据的空间=自身数据+辅助空间
算法1 | 算法2 |
---|---|
for(i=0;i<n/2;i++) | for(i=0;i<n;i++) |
t=a[i]; | b[i]=a[n-i-1] |
a[i]=a[n-i-1]; | for(i=0;i<n;i++) |
a[n-i-1]=t; | a[i]=b[i]; |
s(n)=O(1),原地工作 | s(n)=O(n) |
3.算法设计过程
- 抽象的数据类型=数据的逻辑结构+抽象运算