算法的五个重要的特征
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、算法的五个重要的特征:确定性、能行性、输入、输出、有穷性/有
限性。
2、表示算法的语言主要有:自然语言、流程图、盒图、PAD 图、伪代
码、计算机程序设计语言
3、算法分析有两个阶段:事前分析和时候测试。
4、衡量算法有几个方面:时间和空间。。。
5、渐进意义下的符号的意义: 记:算法的计算时间为f(n), 数量级限界
函数为g(n), 其中,n 是输入或输出规模的某种测度。f(n)表示算法的实际”执行时间一
与机器及语言有关。g( n)是形式简单的函数,如nm,
logn,2n,n!等。是事前分析中通过对计算时间或频率计数统计分析所得的与机器及语言无关的函数。
以下给出算法执行时间:上界( 0)、下界(Q )、“平
均”( )的定义。
定义1.1如果存在两个正常数c和NO,对于所有的N
> NO,有|f(N)|w C|g(N)|,则记作:f(N)= O(g(N))。
1) 当说一个算法具有0(g(n))的计算时间时,指的就是如果此算法
用n 值不变的同一类数据在某台机器上运行时,所用的时间总是小于g(n)的一个常数倍。
2) g(n)是计算时间f(n)的一个上界函数,f(n)的数量级就是g(n)。Eg :因为对所有的N > 1有3N < 4N,所以有
3N=O(N);
因为当N > 1 时有N+1024 < 1025N,所以有N+1024=O(N); 因为当N > 10时有2N2+11N-10W 3N2,所以有
2N2+11N-1O=O(N2)
因为对所有N A 1有N2< N3,我们有N2=O(N3)
作为一个反例N3丰O(N2),因为若不然,则存在正的常数C 和自然数N0,使得当N A N0,有N3W CN2,即N< C。显然,当取
N=max{ N0,C+1}时这个不等式不成立,所以N3丰O(N2)
多项式定理:
定理1.1 若A(n) = amnm+, +a1n+a0 是一个m 次多项式,则有A(n)= O (nm)即:变量n的固定阶数为m的任一多项式,与此多项式的最高阶nm 同阶。
证明:取n0=1,当n A n0 时,有|A(n)| < |am|nm+, +|a1|n+|a0| <
(|am|+|am-1|/n+, +|a0|/nm) nm
w (|am|+|am-1|+, +|a0|) nm 令
c= |am|+|am-1|+, +|a0|
定理得证。
符号O运算性质:(f,g为定义在正数集上的正函数)
( 1 ) O(f)+O(g)=O(max(f,g))
( 2) O(f)+O(g)=O(f+g)
( 3) O(f)O(g)=O(fg)
(4)如果g(N)=O(f(N)),贝U O(f)+O(g)=O(f)
(5)O(Cf(N))=O(f(N)),其中C 是一正常数。
( 6) f=O(f)
定理1.2 如果f(n) =am nm+.+a1n+a0 且am > 0,则f(n)= ?
(nm )。
该定义的优点是与O的定义对称,缺点是f(N)对自然数的不同无穷子集有不同的表达式,且有不同的阶时,不能很
好地刻画出f(N)的下界。比如当
100 N 为正偶数
f(N)=
6N2N 为正奇数
按照定义,得到f(N)=? (1),这是个平凡的下界,对算法分析没有什么价值。
“平均情况”限界函数
定义1.3如果存在正常数c1, c2和n0,对于所有的n
> n0,有c1|g(N)| w |f(N)| w c2|g(N)| 则记作f(N)= (g,(N))
含义:算法在最好和最坏情况下的计算时间就一个常数因子范围内而言是相同的。可看作:既有f(N)= Q (g(N)),又有
f(N)= O (g(N))
【例1.8】循环次数直接依赖规模n-变量计数之一。
(1) x=0;y=0; (2) for(k=1;k<=n;k++) (3) x++; (4) for(i=1;i<=n;i++)
(5) for(j=1;j<=n;j++) (6) y++;
该算法段的时间复杂度为T(n)= O (n2)。当有若干个循环语句时, 算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
【例1.9】循环次数间接依赖规模n-变量计数之二。
(1) x=1;(2) for(i=1 ;i<=n ;i++) (3) for(j=1 ;
j<=i ;j++) (4) for(k=1 ;k<=j ;k++) (5) x++;
该算法段中频度最大的语句是(5),从内层循环向外层分析语句(5)的执行次数:算法段的时间复杂度为:T(n)=O(n3/6+ 低次
项)=O(n ) 。
b.算法的时间复杂度与输入实例的初始状态有关。
这类算法的时间复杂度的分析比较复杂, 一般分最好情况(处理最少的情况),最坏情况(处理最多的情况)和平均情况分别进行讨论。
【例1.10】在数值A[0..n-1]中查找给定值K : (1) i=n-1 ;
(2) while( i>=0 and A[i]<>k )
(3) i=i-1 ;(4) return i ;
此算法的频度不仅与问题规模n 有关, 还与输入实例中A
的各元素取值及k的取值有关:
1. 若A中没有与k相等的元素,则⑵频度f(n)=n(最坏情况);
2. 若A最后一个元素等于k,则(2)频度f(n)是常数1(最好情况);在求平均情况时,一般地假设查找不同元素的概率P是相同的,则算法的平均复杂度为:
若对于查找不同元素的概率P不相同时,其算法复杂
度就只能做近似分析,或在构造更好的算法或存储结构后,做较准确的分析。
例1.11】求N!
递归方程为:T(n)=T(n-1)+0(1)其中0(1)为一次乘
法操作。迭代求解过程如下:
T( n)=T( n-2)+0(1)+0(1)
=T(n- 3)+0(1)+0(1)+0(1) ••=•0(1)+ ……+0(1)+0(1)+0(1
)
=n *0(1) =0(n)
【例1.12】抽象地考虑以下递归方程,且假设n=2k,则迭代求解过程如下:
Tg = 2^(^) 4- 2
=畚J + 2) + 2
=羽苛〕十4 7
=斗多〉+ 2) + 4 + 2
=2 37^(4^) +8+4 + 2
••• T(n) =O(n)
【例1.13】一个楼有n个台阶,有一个人上楼有时一次跨一个台阶,有时一次跨两个台阶,编写一个算法,计算此人有几种不同的上楼方法,并分析算法的时间复杂度。
解:设计一个递归算法。
H(int n)
{
if (n<0) printf( “ Error! ” );
if n=1 return(1);
if n=2 return(2);
else return(H(n-1)+H(n-2));
}
时间复杂度(设T(n))分析:
n w 2
C
T(n)=
T(n-1)+T(n-2)n>2
••• T(n) w 2T(n-1) < 2 T(n-2) <…w 2 T(1) =O(2 )【例1.14】抽象地考虑以下递归方程,且假设n=2k,则
迭代求解过程如下:
T(n)=2T(n/2)+O(n) =2T(n/4)+2O(n/2)+O(n) =…
=O(n)+O(n)+ …+O(n)+O(n)+O(n)=k x O(n) =O(k x n) =O(nlog2 n)
【例1.15】抽象地考虑以下递归方程,迭代求解过程如下:T(n)=T(n/3)+T(2n/3)+n
=T(n/9)+T(2n/9)+n/3+T(2n/9)+T(4n/9)+2n/3 =•••
n=(k+1)n=n(log n+1)
设最长路径长度为k, (2/3) n=1 • k=log n、、、、、、、、、、加图Chapter2
蛮力法
蛮力法是基于计算机运算速度快这一特性,在解决问独时采取的一沖懒惰密策略.这种策略不经过(或者说纟丈很少〉思考,把问题所有情况或所有过程交给计算机去-一尝试,从中找出问题的解嵌
蛮力策略应用:选择排序、冒泡排序、插入排序s g 茅查找、朴素的字符串匹配等。比较常用还有枚举法、盲
弓
搜索算法等。
1 贪婪算法的思想:贪婪算法通过一系列的局部选择来
得到一个问题的解。所作的每一个选择都是当前状态
下最优”的选择。
要依照某种策略。策略只顾眼前,不管将来”,称之为贪婪策略”。
贪婪算法没有固定的算法框架,算法设计的关键是贪婪策
略的选择。
1贪婪算法的思想■例4.2活动安排问题-算法
..按站束时间非减序排序:fl<=(Z <= .. <= fii -O(nlonn)
L从第I亍活动开始,按糜序放进集合乩檢入活动i当且便当与集合A中已有元索相容*
与集台A中垠后元素j比较=若食》二左则加入.否则不加入
©Fix & “ ( f k)—煤合的谥大绘集时间
3=1