- 要掌握基本的数据组织和数据处理方法:
各种数据的逻辑结构描述
各种数据的存储结构表示
各种数据结构的运算定义
设计实现运算的算法
分析算法效率
数据结构:
1.带结构的数据元素的集合
2.逻辑结构->存储结构->数据运算
3.根据逻辑结构设计存储结构,根据存储结构设计算法,最后对算法进行分析找出最优的算法
- 逻辑关系:
集合
线性结构
树形结构
图形结构
算法
- 算法的定义:
数据元素之间的关系有逻辑关系和物理关系,对应的运算有基于逻辑结构的运算描述和基于存储结构的运算实现。
通常将基于存储机构的运算实现步骤或过程称为算法。
- 算法的五个重要特性:
有穷性:在有穷步后结束,算法能够停机
确定性:无二义性
可行性:通过基本运算有限次执行来实现,也就是算法中每一个动作能够机械性的被执行
有输入(表示存在数据处理)
有输出
- 算法的描述:
返回值 算法对应的函数名(形参列表)
{
//零时变量的定义
//实现由输入参数到输出参数的操作
....
}
返回值:通常为bool值,表示算法是否执行成功
形参列表:由输入型参数和输出型参数构成
C++中使用引用&描述输出型参数
- 时间复杂度:
事后统计分析方法:编写算法对应程序,统计其执行时间。
但因为程序使用不同的编程语言,不同的编程环境还有其它种种因素不能使用绝对运行时间进行比较。
事前估算分析方法:
1.撇开上述因素,认为算法的执行时间是问题规模n的函数
2.频度(T(n)):求出算法执行原操作的次数,它是问题规模n的函数
3.算法的大致执行时间与T(n)成正比
4.比较不同算法的T(n)大小得出算法执行时间的好坏
T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))
时间复杂度只需要求
T
(
n
)
T(n)
T(n)的最高阶
O
(
1
)
<
O
(
n
)
<
O
(
n
l
o
g
2
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
n
!
)
O(1) < O(n) < O(nlog_{2}n) < O(n^2) < O(n^3) < O(n!)
O(1)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(n!)
- 空间复杂度:
用于度量一个算法在运行过程中临时占用的存储空间的大小
一般也作为问题规模n的函数,采用数量级形式描述,记作:
S ( n ) = O ( g ( n ) ) S(n) = O(g(n)) S(n)=O(g(n))
若一个算法的复杂度为O(1)则将这个算法称为原地工作算法或就地工作算法
空间复杂度分析只考虑零时占用的存储空间
- 最好、最坏和平均时间复杂度分析:
例题:设计了一个算法(如下代码所示),求 n n n个整数的序列中前i个元素的最大值。分析算法的最好、最坏和平均时间复杂度
int fun(int a[], int n, int i){
int j, maxi = a[0];
for(j = 1; j <= i-1; j++){
if(a[j] > maxi) maxi = a[j];
}
return max;
}
解: i i i的取值范围为 1 1 1~ n n n,求前i个元素的最大值需要比较 i − 1 i-1 i−1次:
平均时间复杂度:
T
(
n
)
=
1
n
∑
i
n
(
i
−
1
)
=
n
−
1
2
=
O
(
n
)
T(n)=\frac{1}{n}\sum_{i}^{n}(i-1)=\frac{n-1}{2}=O(n)
T(n)=n1i∑n(i−1)=2n−1=O(n)
最好&坏时间复杂度:
W
(
n
)
=
O
(
n
)
(
当
i
=
n
时
)
W(n)=O(n)(当i=n时)
W(n)=O(n)(当i=n时)
B
(
n
)
=
O
(
1
)
(
当
i
=
1
时
)
B(n)=O(1)(当i=1时)
B(n)=O(1)(当i=1时)
- 递归算法的时空分析
递归算法是指算法中出现调用自己的成分
递归算法分析也称为变长时空分析
非递归算法分析也称为定长时空分析
void fun(int a[], int n, int k){
int i;
if(k==n-1){
for(i=0;i<n;i++)
printf("%d\n",a[i]);
}else{
for(i=k;i<n;i++)
a[i]=a[i]+i*i;
fun(a,n,k+1);
}
}
时间复杂度:
解:设 f u n ( a , n , 0 ) fun(a,n,0) fun(a,n,0)的执行时间为 T ( n ) T(n) T(n), f u n ( a , n , k ) fun(a,n,k) fun(a,n,k)的执行时间为$T1(n,k) -> T(n)=T1(n,0) $
T 1 ( n , k ) = ( n − k ) + T 1 ( n , k + 1 ) T1(n,k)=(n-k)+T1(n,k+1) T1(n,k)=(n−k)+T1(n,k+1)
T ( n ) = T 1 ( n , 0 ) = n + ( n − 1 ) + . . . + 1 = n ( n + 1 ) 2 = O ( n 2 ) T(n)=T1(n,0)=n+(n-1)+...+1=\frac{n(n+1)}{2}=O(n^2) T(n)=T1(n,0)=n+(n−1)+...+1=2n(n+1)=O(n2)
空间复杂度:
解:设
f
u
n
(
a
,
n
,
0
)
fun(a,n,0)
fun(a,n,0)的执行空间为
S
(
n
)
S(n)
S(n),
f
u
n
(
q
,
n
,
k
)
fun(q,n,k)
fun(q,n,k)的空间为
S
1
(
n
,
k
)
−
>
S
(
n
)
=
S
1
(
n
,
0
)
S1(n,k)-> S(n)=S1(n,0)
S1(n,k)−>S(n)=S1(n,0):
S
1
(
n
,
0
)
=
1
+
1
+
.
.
.
+
1
=
n
S1(n,0)=1+1+...+1=n
S1(n,0)=1+1+...+1=n
S
(
n
)
=
S
1
(
n
,
0
)
=
n
=
O
(
n
)
S(n)=S1(n,0)=n=O(n)
S(n)=S1(n,0)=n=O(n)