数据结构
2.算法及算法分析
算法:是指令的有限序列,是对特定问题求解步骤的描述。
算法具有下列5个重要特性:
1.有穷性:步骤有限,执行时间有限。
2.确定性:有确切的合义,无二义性,算法只有唯一的一条执行路径。
3.可行性:可以通过已经实现的基本运算执行有限次来实现的;
4.输入:算法具有零个或多个输入。
5.输出:算法具有一个或多个输出。
算法和程序的区别:
(1)在执行时间上,算法所描述的步骤一定是有限的,而程序可以无限地执行下去。因此程序并不需要满足上述的第一个条件(有穷性)。例如操作系统程序,是一个在无限循环中执行的程序,因而不是一个算法。
(2)在语言描述上,程序必须采用规定的程序设计语言来书写,而算法没有这种限制。
设计一个好的算法通常要考虑达到以下目标:
1.正确性:算法应能正确地实现预定的功能;
2.易读性:算法应易于阅读和理解,以便于调试、修改和扩充;
3.健壮性(鲁棒性):当环境发生变化(如遇到非法输入)时,算法能适当地做出反应或进行处理,不会产生不正确的运算结果;
4.高效率:具有较高的时间和空间性能。
算法的评价方法常分两类:
1.事前分析估计
2.事后统计
算法的时间复杂度
算法的时间复杂度(Time Complexity):T(N)是该算法的时间耗费,是其所求解问题规模N的函数。当问题规模N趋向无穷大时,不考虑具体的运行时间函数,**只考虑运行时间函数的数量级(阶)**这称为算法的渐进时间复杂度(Asymptotic Time Complexity)。
渐进表示法的常用记法如下:
大O表示法
T
(
N
)
=
O
(
f
(
N
)
)
T(N)=O(f(N))
T(N)=O(f(N))
说明:如果存在常量c>0和正整数
N
0
N_0
N0>=1,当
N
≥
N
0
N\geq N_0
N≥N0时有
T
(
N
)
≤
c
f
(
N
)
T(N)\leq cf(N)
T(N)≤cf(N)。即给出了时间复杂度的上界,不可能比cf(N)更大。
语句的频度(frequency count):指的是该语句重复执行的次数。
常通过计算基本操作的语句频度,求解时间复杂度。
【例3】分析下述程序段的时间复杂度。
{++x;S=0;}
选取“++x;”为基本操作,语句频度为1,则时间复杂度为O(1),即常量阶。
【例4】分析下述程序段的时间复杂度。
for(j=1;j<=10000;++j){
++X;S+=x;}
选取“++x;”为基本操作,语句频度为10000,则时间复杂度为O(1),即常量阶。
【例5】分析下述程序段的时间复杂度。
s=0;
for(j=1;j<=n;j*=2)
++x;
选取“++x;”为基本操作,语句频度为
log
2
n
\log_2n
log2n,则时间复杂度为O(
log
n
\log_{}{n}
logn),即对数阶。
【例6】分析下述程序段的时间复杂度。
for(i=1;i<=2*n;++i){
++x;s+=x;}
选取“++x;”为基本操作,语句频度为2xn,则时间复杂度为0(n),即线性阶。
【例7】分析下述程序段的时间复杂度。
for(j=1;j<=n;++j){
for(k=1;k<=n/4;++k){
++x;s+=x;}
}
选取“++x;”为基本操作,语句频度为nxn/4,则时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),即平方阶。
【例8】分析下述程序段的时间复杂度。
s=0;
for(j=1;j<=n;j++)
for(k=1;k<=j;++k)
++x;
选取“++x;”为基本操作,语句频度为(1+n)xn/2,则时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),即平方阶。
并非所有的双重循环的时间复杂度都是
O
(
n
2
)
O(n^2)
O(n2)的,下面举例说明。
【例9】分析下述程序段的时间复杂度。
for(j=1;j<n;j*=2){
for(k=1;k<=n;++k){
++x;s+=x;}
}
时间复杂度为
O
(
n
log
2
n
)
O(n\log_2n)
O(nlog2n),即线性对数阶。
冒泡排序的算法:
最好时间复杂度:
O
(
n
)
O(n)
O(n)
最坏时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
平均时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
选择最坏情况和平均情况,得出冒泡的时间复杂度是
n
2
n^2
n2
算法的空间复杂度
如果所需额外空间相对于输入数据量来说只是一个常数,则称此算法为“原地工作”,此时的空间复杂度为
O
(
1
)
O(1)
O(1);
例:问题的规模是n,
(1)若使用了大小是n的辅助一维数组,则空间复杂度为?
O
(
n
)
O(n)
O(n)
(2)若使用了大小是n*n的二维数组,则空间复杂度为?
O
(
n
2
)
O(n^2)
O(n2)
(3)若使用了100个辅助变量,则空间复杂度为?
O
(
1
)
O(1)
O(1)