Click here to load reader
Upload
genero
View
159
Download
9
Embed Size (px)
DESCRIPTION
计算机算法设计与分析(第 2 版). 王晓东 编著 电子工业出版社. 第 1 章 算法概述. 学习要点 : 理解算法的概念。 理解什么是程序,程序与算法的区别和内在联系。 掌握算法的计算复杂性概念。 掌握算法渐近复杂性的数学表述。 掌握用 C++ 语言描述算法的方法。. 算法 (Algorithm). 算法是指解决问题的一种方法或一个过程。 算法是若干指令的有穷序列,满足性质: (1) 输入 :有外部提供的量作为算法的输入。 (2) 输出 :算法产生至少一个量作为输出。 (3) 确定性 :组成算法的每条指令是清晰,无歧义的。 - PowerPoint PPT Presentation
Citation preview
计算机算法设计与分析(第计算机算法设计与分析(第 22 版)版)
王晓东 编著王晓东 编著电子工业出版社电子工业出版社
第第 11 章 算法概述章 算法概述学习要点学习要点 : :
理解算法的概念。理解算法的概念。 理解什么是程序,程序与算法的区别和内在联系。理解什么是程序,程序与算法的区别和内在联系。 掌握算法的计算复杂性概念。掌握算法的计算复杂性概念。 掌握算法渐近复杂性的数学表述。掌握算法渐近复杂性的数学表述。 掌握用掌握用 C++C++ 语言描述算法的方法。语言描述算法的方法。
算法算法 (Algorithm)(Algorithm)
算法是指解决问题的一种方法或一个过程。算法是指解决问题的一种方法或一个过程。算法是若干指令的有穷序列,满足性质:算法是若干指令的有穷序列,满足性质:(1)(1) 输入输入:有外部提供的量作为算法的输入。:有外部提供的量作为算法的输入。(2)(2) 输出输出:算法产生至少一个量作为输出。:算法产生至少一个量作为输出。(3)(3) 确定性确定性:组成算法的每条指令是清晰,无歧义的。:组成算法的每条指令是清晰,无歧义的。(4)(4) 有限性有限性:算法中每条指令的执行次数是有限的,执:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。行每条指令的时间也是有限的。
程序程序 (Program)(Program)
程序是算法用某种程序设计语言的具体实现。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质程序可以不满足算法的性质 (4)(4) 。。例如操作系统,是一个在无限循环中执行的程序,因例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。而不是一个算法。操作系统的各种任务可看成是单独的问题,每一个问操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。该子程序得到输出结果后便终止。
问题求解问题求解 (Problem Solving)(Problem Solving)
证明正确性分析算法设计程序
理解问题精确解或近似解选择数据结构算法设计策略
设计算法
算法复杂性分析算法复杂性分析 算法复杂性 算法复杂性 = = 算法所需要的计算机资源算法所需要的计算机资源算法的时间复杂性算法的时间复杂性 TT((nn)) ;;算法的空间复杂性算法的空间复杂性 SS((nn)) 。。其中其中 nn 是问题的规模(输入大小)。是问题的规模(输入大小)。
算法的时间复杂性算法的时间复杂性(( 11 ))最坏情况最坏情况下的时间复杂性下的时间复杂性 TTmaxmax((nn) = max{ ) = max{ TT(I) | size(I)=(I) | size(I)=n n }}
(( 22 ))最好情况最好情况下的时间复杂性下的时间复杂性 TTminmin((nn) = min{ ) = min{ TT(I) | size(I)=(I) | size(I)=n n }}
(( 33 ))平均情况平均情况下的时间复杂性下的时间复杂性 TTavgavg((nn) =) =
其中其中 II 是问题的规模为是问题的规模为 nn 的实例,的实例, pp(I)(I) 是实 例是实 例 II 出现的概率。出现的概率。
nIsize
ITIp)(
)()(
算法渐近复杂性算法渐近复杂性
TT((nn) ) , as , as nn ; ;
((TT((nn) - ) - tt((nn) )/ ) )/ TT((nn) ) 0 0 ,, as as nn;;
tt((nn)) 是是 TT((nn)) 的渐近性态,为算法的渐近复杂性。的渐近性态,为算法的渐近复杂性。在数学上, 在数学上, tt((nn)) 是是 TT((nn)) 的渐近表达式,是的渐近表达式,是 TT((nn)) 略去略去低阶项留下的主项。它比低阶项留下的主项。它比 TT((nn) ) 简单。简单。
渐近分析的记号渐近分析的记号
在下面的讨论中,对所有在下面的讨论中,对所有 nn ,, ff((nn) ) 0 0 ,, gg((nn) ) 0 0 。。(( 11 ))渐近上界记号渐近上界记号 OO
OO((gg((nn)) = { )) = { ff((nn) | ) | 存在正常数存在正常数 cc 和和 nn00 使得对所有使得对所有 nn nn00
有:有: 0 0 ff((nn) ) cgcg((nn) }) }
(( 22 ))渐近下界记号渐近下界记号 ((gg((nn)) = { )) = { ff((nn) | ) | 存在正常数存在正常数 cc 和和 nn00 使得对所有使得对所有 nn nn00
有:有: 00 cgcg((nn) ) ff((nn) }) }
(( 33 ))非紧上界记号非紧上界记号 oo
oo((gg((nn)) = { )) = { ff((nn) | ) | 对于任何正常数对于任何正常数 cc>0>0 ,,存在正数和存在正数和 nn0 0
>0>0 使得对所有使得对所有 nn nn00 有:有: 0 0 ff((nn)<)<cgcg((nn) }) }
等价于等价于 ff((nn) / ) / gg((nn) ) 0 0 ,, as as nn 。。(( 44 ))非紧下界记号非紧下界记号 ((gg((nn)) = { )) = { ff((nn) | ) | 对于任何正常数对于任何正常数 cc>0>0 ,,存在正数和存在正数和 nn
0 0 >0>0 使得对所有使得对所有 nn nn00 有:有: 0 0 cgcg((nn) < ) < ff((nn) }) }
等价于等价于 ff((nn) / ) / gg((nn) ) ,, as as nn 。。ff((nn) ) ( (gg((nn)) )) gg((nn) ) oo ( (ff((nn)) ))
(( 55 ))紧渐近界记号紧渐近界记号 ((gg((nn)) = { )) = { ff((nn) | ) | 存在正常数存在正常数 cc11,c,c22 和和 nn00 使得对所有使得对所有 nn
nn00 有:有: cc11gg((nn) ) ff((nn) ) cc22gg((nn) }) }
定理定理 11 :: ((gg((nn)) = )) = OO ( (gg((nn)) )) ( (gg((nn)) ))
渐近分析记号在等式和不等式中的意义渐近分析记号在等式和不等式中的意义ff((nn)= )= ((gg((nn)))) 的确切意义是:的确切意义是: ff((nn) ) ((gg((nn)))) 。。一般情况下,等式和不等式中的渐近记号一般情况下,等式和不等式中的渐近记号 ((gg((nn)))) 表示表示
((gg((nn)))) 中的某个函数。中的某个函数。例如:例如: 22nn2 2 + 3+ 3n n + 1 = 2+ 1 = 2nn2 2 + + ((nn) ) 表示表示 22nn2 2 +3+3n n +1=2+1=2nn2 2 + + ff((nn)) ,其中,其中 ff((nn) ) 是是 ((nn)) 中某个函数。中某个函数。等式和不等式中渐近记号等式和不等式中渐近记号 OO,,oo, , 和和的意义是类似的。的意义是类似的。
渐近分析中函数比较渐近分析中函数比较ff((nn)= )= OO((gg((nn)) )) a a b; b;
ff((nn)= )= ((gg((nn)) )) a a b; b;
ff((nn)= )= ((gg((nn)) )) a = b; a = b;
ff((nn)= )= oo((gg((nn)) )) a < b; a < b;
ff((nn)= )= ((gg((nn)) )) a > b. a > b.
渐近分析记号的若干性质渐近分析记号的若干性质(( 11 )传递性:)传递性:ff((nn)= )= ((gg((nn)))) , , gg((nn)= )= ((hh((nn)) )) ff((nn)= )= ((hh((nn)))) ;;ff((nn)= )= OO((gg((nn)))) , , gg((nn)= )= OO ( (hh((nn)) )) ff((nn)= )= OO ( (hh((nn)))) ;;ff((nn)= )= ((gg((nn)))) , , gg((nn)= )= ( (hh((nn)) )) ff((nn)= )= ((hh((nn)))) ;;ff((nn)= )= oo((gg((nn)))) , , gg((nn)= )= oo((hh((nn)) )) ff((nn)= )= oo((hh((nn)))) ;;ff((nn)= )= ((gg((nn)))) , , gg((nn)= )= ( (hh((nn)) )) ff((nn)= )= ( (hh((nn)))) ;;
(( 22 )反身性:)反身性:ff((nn)= )= ((ff((nn)))) ;;ff((nn)= )= OO((ff((nn)))) ;;ff((nn)= )= ((ff((nn)).)).
(( 33 )对称性:)对称性:ff((nn)= )= ((gg((nn)) )) gg((nn)= )= ( (ff((nn)) )) ..
(( 44 )互对称性:)互对称性:ff((nn)= )= OO((gg((nn)) )) gg((nn)= )= ( (ff((nn)) )) ;;ff((nn)= )= oo((gg((nn)) )) gg((nn)= )= ( (ff((nn)) )) ;;
(( 55 )算术运算:)算术运算:OO((ff((nn))+))+OO((gg((nn)) = )) = OO(max{(max{ff(n),(n),gg((nn)}) )}) ;;OO((ff((nn))+))+OO((gg((nn)) = )) = OO((ff(n)+(n)+gg((nn)) )) ;;OO((ff((nn))*))*OO((gg((nn)) = )) = OO((ff(n)*(n)*gg((nn)) )) ;;OO((cfcf((nn)) = )) = OO((ff(n)) (n)) ;;gg((nn)= )= OO((ff((nn)) )) OO((ff((nn))+))+OO((gg((nn)) = )) = OO((ff(n)) (n)) 。。
规则规则 OO((ff((nn))+))+OO((gg((nn)) = )) = OO(max{(max{ff(n),(n),gg((nn)}) )}) 的的证明:证明:对于任意对于任意 ff11((nn) ) OO((ff((nn)) )) ,存在正常数,存在正常数 cc11 和自然数和自然数 nn11 ,使得对所有,使得对所有 nn
nn11 ,有,有 ff11((nn) ) cc11ff((nn) ) 。。类似地,对于任意类似地,对于任意 gg11((nn) ) OO((gg((nn)) )) ,存在正常数,存在正常数 cc22 和自然数和自然数 nn22 ,使,使得对所有得对所有 nn nn22 ,有,有 gg11((nn) ) cc22gg((nn) ) 。。令令 cc33=max{=max{cc11, , cc22}} , , nn33 =max{ =max{nn11, , nn22}} ,, hh((nn)= max{)= max{ff(n),(n),gg((nn)} )} 。。则对所有的 则对所有的 n n nn33 ,有,有ff11((nn) +) +gg11((nn) ) cc11ff((nn) + ) + cc22gg((nn) )
cc33ff((nn) + ) + cc33gg((nn)= )= cc33((ff((nn) + ) + gg((nn))))
cc332 max{2 max{ff(n),(n),gg((nn)})}
= 2= 2cc33hh((nn) = ) = OO(max{(max{ff(n),(n),gg((nn)}) .)}) .
算法渐近复杂性分析中常用函数算法渐近复杂性分析中常用函数(( 11 )单调函数)单调函数单调递增:单调递增: mm nn ff((mm) ) ff((nn) ;) ;
单调递减:单调递减: mm nn ff((mm) ) ff((nn););
严格单调递增:严格单调递增: mm < < nn ff((mm) < ) < ff((nn););
严格单调递减:严格单调递减: mm < < nn ff((mm) > ) > ff((nn).).
(( 22 )取整函数)取整函数 x x :不大于:不大于 xx 的最大整数;的最大整数; xx :不小于:不小于 xx 的最小整数。 的最小整数。
取整函数的若干性质取整函数的若干性质 xx-1 < -1 < x x x x x x < < xx+1+1 ;; nn/2/2 + + n n/2 /2 = = nn;;
对于对于 nn 0 0 ,, a,ba,b>0>0 ,有:,有: nn//aa / /bb = = n n//abab ; ;
nn//a a / /b b = = nn//ab ab ; ;
aa//bb ( (aa+(+(bb-1))/-1))/bb;;
aa//b b ( (aa-(-(bb-1))/-1))/bb;;
ff((xx)= )= x x , , gg((xx)= )= x x 为单调递增函数。为单调递增函数。
(( 33 )多项式函数)多项式函数 pp((nn)= )= aa00++aa11nn++aa22nn22+…++…+aaddnndd ; ; aadd>0;>0;
pp((nn) = ) = ((nndd););
ff((nn) = ) = OO((nnkk) ) ff((nn)) 多项式有界;多项式有界; ff((nn) = ) = OO(1) (1) ff((nn) ) cc;;
k k dd p p((nn) = ) = OO((nnkk) ;) ;
k k dd p p((nn) = ) = ((nnkk) ;) ;
k >k > dd p p((nn) = ) = oo((nnkk) ;) ;
k k < < dd p p((nn) = ) = ((nnkk) .) .
(( 44 )指数函数)指数函数 对于正整数对于正整数 mm,,nn 和实数和实数 aa>0:>0:
aa00=1;=1;
aa11==a a ;;
aa-1-1=1/=1/a a ;;
((aamm))n n = = aamn mn ;;
((aamm))n n = (= (aann))m m ;;
aammaan n == aam+n m+n ;;
aa>1 >1 aann 为单调递增函数为单调递增函数 ;;
aa>1 >1 nnbb = = oo((aann))0lim n
b
n an
eexx 1+ 1+xx;;
|x| |x| 1 1 1+ 1+xx eexx 1+ 1+x+xx+x22 ; ;
eexx = 1+ = 1+x+ x+ ((xx22), as ), as xx0;0;
0
32
!!3!21
i
ix
ixxxxe
xn
ne
nx
1lim
(( 55 )对数函数)对数函数 log log n n = log= log22nn;;
lg lg n n = log= log1010nn;;
ln ln n n = log= logeenn;;
loglogkkn n = (log = (log nn))kkl;l;
log log log log n n = log(log = log(log nn););
for a>0,b>0,c>0for a>0,b>0,c>0abba log
baab ccc loglog)(log
ana bn
b loglog
ba
ac
cb log
loglog
aa bb log)/1(log
ba
ab log
1log
ac bb ca loglog
|x| |x| 1 1
for for x x > -1,> -1,
for any for any a a > 0, , > 0, , log logbbn n = = oo((nnaa))
.5432
)1ln(5432
xxxxxx
xxxx
)1ln(1
0loglim)2(
loglim log a
b
nna
b
n nnn
(( 66 )阶层函数)阶层函数
Stirling’s approximation Stirling’s approximation
00
)!1(1
!
nn
nnn
nn 321!
nennn
n 11π2!
neennn
n
π2! nn n 12
1α112
1
)(! nnon
)2(! nn
)log()!log( nnn
算法分析中常见的复杂性函数算法分析中常见的复杂性函数
小规模数据小规模数据
中等规模数据中等规模数据
用用 c++c++ 描述算法描述算法
(( 11 )选择语句:)选择语句:(( 1.1) if 1.1) if 语句:语句:
(( 1.2) 1.2) ?语句:?语句:
if (expression) statement;else statement;
exp1?exp2:exp3 y= x>9 ? 100:200; 等价于: if (x>9) y=100; else y=200;
(( 1.3) switch1.3) switch 语句:语句:
switch (expression) { case 1: statement sequence; break; case 2: statement sequence; break; default: statement sequence; }
(( 22 )迭代语句:)迭代语句:
(( 2.1) for 2.1) for 循环:循环: for (init;condition;inc) statement;for (init;condition;inc) statement;
(( 2.2) while 2.2) while 循环:循环: while (condition) statement;while (condition) statement;
(( 2.3) do-while 2.3) do-while 循环:循环: do{do{
statement;statement;
} while (condition); } while (condition);
(( 33 )跳转语句:)跳转语句:
(( 3.1) return3.1) return 语句:语句: return expression;return expression;
(( 3.2) goto3.2) goto 语句:语句: goto label;goto label;
label:label:
(( 44 )函数:)函数:
例:例:
return-type function name(para-list){ body of the function }
int max(int x,int y) { return x>y?x:y; }
(( 55 )模板)模板 templatetemplate ::
template <class Type>Type max(Type x,Type y){ return x>y?x:y;}
int i=max(1,2) ;double x=max(1.0,2.0) ;
(( 66 )动态存储分配:)动态存储分配:(( 6.16.1 )运算符)运算符 new new ::运算符运算符 newnew 用于动态存储分配。 用于动态存储分配。 newnew 返回一个指向所分配空间的指针。返回一个指向所分配空间的指针。例:例: int int xx ;; y=new inty=new int ;; y=10y=10 ;;也可将上述各语句作适当合并如下:也可将上述各语句作适当合并如下:int int y=new inty=new int ;; y=10y=10 ;;或 或 int int y=new int(10)y=new int(10) ;;或 或 int int yy ;; y=new int(10)y=new int(10) ;;
(( 6.26.2 )一维数组 :)一维数组 :
为了在运行时创建一个大小可动态变化的一维浮点数组为了在运行时创建一个大小可动态变化的一维浮点数组 xx ,可先,可先将将 xx 声明为一个声明为一个 floatfloat 类型的指针。然后用类型的指针。然后用 newnew 为数组动态地分为数组动态地分配存储空间。配存储空间。例:例:float float x=new float[n]x=new float[n] ;;创建一个大小为创建一个大小为 nn 的一维浮点数组。运算符的一维浮点数组。运算符 newnew 分配分配 nn 个浮点数个浮点数所需的空间,并返回指向第一个浮点数的指针。所需的空间,并返回指向第一个浮点数的指针。然后可用然后可用 x[0]x[0] ,, x[1]x[1] ,…,,…, x[n-1]x[n-1] 来访问每个数组元素。来访问每个数组元素。
(( 6.36.3 )运算符)运算符 delete delete ::当动态分配的存储空间已不再需要时应及时释放所占当动态分配的存储空间已不再需要时应及时释放所占用的空间。用的空间。用运算符用运算符 deletedelete 来释放由来释放由 newnew 分配的空间。分配的空间。例:例:delete ydelete y ;;delete [ ]xdelete [ ]x ;;分别释放分配给分别释放分配给 yy 的空间和分配给一维数组的空间和分配给一维数组 xx 的空间。的空间。
(( 6.46.4 )动态二维数组 :)动态二维数组 :
创建类型为创建类型为 TypeType 的动态工作数组,这个数组有的动态工作数组,这个数组有 rowsrows
行和行和 colscols 列。列。template <class Type>void Make2DArray(Type** &x,int rows, int cols){ x=new Type*[rows]; for (int i=0;i<rows;i++) x[i]=new Type[cols];}
当不再需要一个动态分配的二维数组时,可按以下步骤释放它所占当不再需要一个动态分配的二维数组时,可按以下步骤释放它所占用的空间。首先释放在用的空间。首先释放在 forfor 循环中为每一行所分配的空间。然后释循环中为每一行所分配的空间。然后释放为行指针分配的空间。放为行指针分配的空间。
释放空间后将释放空间后将 xx 置为置为 00 ,以防继续访问已被释放的空间。,以防继续访问已被释放的空间。
template <class Type>void Delete2DArray(Type** &x,int rows){ for (int i=0;i<rows;i++) delete []x[i]; delete []x; x=0;}
算法分析方法算法分析方法例:顺序搜索算法例:顺序搜索算法
template<class Type>int seqSearch(Type *a, int n, Type k){ for(int i=0;i<n;i++)
if (a[i]==k) return i; return -1;}
(( 11 )) TTmaxmax((nn) = max{ ) = max{ TT(I) | size(I)=(I) | size(I)=n n }=}=OO((nn))
(( 22 )) TTminmin((nn) = min{ ) = min{ TT(I) | size(I)=(I) | size(I)=n n }=}=OO(1)(1)
(( 33 )在平均情况下,假设:)在平均情况下,假设: (a) (a) 搜索成功的概率为搜索成功的概率为 p p ( 0 ( 0 pp 1 ) 1 ) ;; (b) (b) 在数组的每个位置在数组的每个位置 i i ( 0 ( 0 i i < < n n )) 搜索成功的概率相同,均搜索成功的概率相同,均为 为 pp//nn 。。
nIsize
avg ITIpnT)(
)()()(
pnnpn
np
np
np
1321
)1(2)1(1
1
pnnppninp n
i
算法分析的基本法则算法分析的基本法则非递归算法:非递归算法:(( 11 )) for / while for / while 循环循环循环体内计算时间循环体内计算时间 ** 循环次数;循环次数;(( 22 )嵌套循环)嵌套循环循环体内计算时间循环体内计算时间 ** 所有循环次数;所有循环次数;(( 33 )顺序语句)顺序语句各语句计算时间相加;各语句计算时间相加;(( 44 )) if-elseif-else 语句语句ifif 语句计算时间和语句计算时间和 elseelse 语句计算时间的较大者。语句计算时间的较大者。
template<class Type>void insertion_sort(Type *a, int n){ Type key; // cost times for (int i = 1; i < n; i++){ // c1 n key=a[i]; // c2 n-1 int j=i-1; // c3 n-1 while( j>=0 && a[j]>key ){ // c4 sum of ti
a[j+1]=a[j]; // c5 sum of (ti-1) j--; // c6 sum og (ti-1) }
a[j+1]=key; // c7 n-1 }}
在最好情况下,在最好情况下, ttii=1, for 1 =1, for 1 i i <<nn;;
在最坏情况下,在最坏情况下, tti i ii+1, for 1 +1, for 1 i i <<nn;;
)1()1()1()1()1()( 7
1
16
1
15
1
14321
nctctctcncncncnTn
ii
n
ii
n
ii
)1()1()1()1()( 74321min ncncncncncnT
)()()( 743274321 nOccccnccccc
1
1
12)1()1(
n
i
nni
1
1 2)1(n
i
nni
)(
)(22
)1(2)1(
2)1(1
2)1(
)1()1()(
2
74327654
3212654
7654
321max
nO
ccccncccccccnccc
ncnncnncnnc
ncncncnT
对于输入数据对于输入数据 a[i]=n-i,i=0,1,…,n-1a[i]=n-i,i=0,1,…,n-1 ,算法,算法 insertion_sort insertion_sort 达到其达到其最坏情形。因此,最坏情形。因此,
由此可见,由此可见, TTmaxmax((nn)= )= ((nn22))
)(
)(22
)(
2
74327654
3212654
max
n
ccccncccc
cccnccc
nT
最优算法最优算法问题的计算时间下界为问题的计算时间下界为 ((ff((nn)))) ,则计算时间复杂性为,则计算时间复杂性为 O(O(ff((nn)))) 的算法的算法是最优算法。是最优算法。例如,排序问题的计算时间下界为例如,排序问题的计算时间下界为 ((nnloglognn)) ,计算时间复杂性为,计算时间复杂性为 OO((nn
loglognn)) 的排序算法是最优算法。的排序算法是最优算法。堆排序算法是最优算法。堆排序算法是最优算法。
递归算法复杂性分析递归算法复杂性分析 int int factorialfactorial(int n)(int n) {{ if (n == 0) return 1; if (n == 0) return 1; return n*factorial(n-1);return n*factorial(n-1); }}
01)1(00
)(nnTn
nT
nnT )(
课后作业课后作业习题 习题 1-71-7 ,, 1-81-8 ,, 1-101-10 。。