算法的五个重要的特征Word文档格式.docx
- 文档编号:17806406
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:26
- 大小:622.10KB
算法的五个重要的特征Word文档格式.docx
《算法的五个重要的特征Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法的五个重要的特征Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
定理得证。
符号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)),贝UO(f)+O(g)=O(f)
(5)O(Cf(N))=O(f(N)),其中C是一正常数。
(6)f=O(f)
定理1.2如果f(n)=amnm+.+a1n+a0且am>
0,则f(n)=?
(nm)。
该定义的优点是与O的定义对称,缺点是f(N)对自然数的不同无穷子集有不同的表达式,且有不同的阶时,不能很
好地刻画出
f(N)的下界。
比如当
100N为
正偶数
f(N)=
6N2
N为正奇数
按照定义,得到f(N)=?
(1),这是个平凡的下界,对算法分析没有什么价值。
“平均情况”限界函数
定义1.3如果存在正常数c1,c2和n0,对于所有的n
n0,有c1|g(N)|w|f(N)|wc2|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<
i++)
(5)for(j=1;
j<
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;
=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>
=0andA[i]<
k)
(3)i=i-1;
(4)returni;
此算法的频度不仅与问题规模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
=羽苛〕十47
=斗多〉+2)+4+2
=237^(4^)+8+4+2
3=1
•••T(n)=O(n)
【例1.13】一个楼有n个台阶,有一个人上楼有时一次跨一个台阶,有时一次跨两个台阶,编写一个算法,计算此人有几种不同的上楼方法,并分析算法的时间复杂度。
解:
设计一个递归算法。
H(intn)
{
if(n<
0)printf(“Error!
”);
ifn=1return
(1);
ifn=2return
(2);
elsereturn(H(n-1)+H(n-2));
}
时间复杂度(设T(n))分析:
nw2
C
T(n)=
T(n-1)+T(n-2)
n>
2
•••T(n)w2T(n-1)<
2T(n-2)<
…w2T
(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)
=kx
O(n)=O(kxn)=O(nlog2n)
【例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(logn+1)
设最长路径长度为k,(2/3)n=1•k=logn、、、、、、、、、、加图
Chapter2
蛮力法
蛮力法是基于计算机运算速度快这一特性,在解决问独时采取的一沖懒惰密策略.这种策略不经过(或者说纟丈很少〉思考,把问题所有情况或所有过程交给计算机去-一尝试,从中找出问题的解嵌
蛮力策略应用:
选择排序、冒泡排序、插入排序sg茅查找、朴素的字符串匹配等。
比较常用还有枚举法、盲弓搜索算法等。
1贪婪算法的思想:
贪婪算法通过一系列的局部选择来
得到一个问题的解。
所作的每一个选择都是当前状态
下最优”的选择。
要依照某种策略。
策略只顾眼前,不管将来”,称之为贪婪策略”。
贪婪算法没有固定的算法框架,算法设计的关键是贪婪策
略的选择。
1贪婪算法的思想■例4.2活动安排问题-算法
..按站束时间非减序排序:
fl<
=(Z<
=..<
=fii-O(nlonn)
L从第I亍活动开始,按糜序放进集合乩檢入活动i当且便当与集合A中已有元索相容*
与集台A中垠后元素j比较=若食》二左则加入.否则不加入
©
Fix&
“(fk)—煤合的谥大绘集时间
0(11)
voidGreedySrlecIin111,lulsj]iiutQ]JjooIA[]){A|l]=true;
//A(i|=tmeM示仝入集合
forflftiI-2:
i<
-n:
H-+)
[IT何]nn
{A(i]=true;
鬥;
4酒功时拦持时间和
雄卓时问甘于睦甄£
和f中砒站克叶问的
非总序特弭
tkeA[i|=fake;
I
查讎入的活幼已搖结束时间的菲;
《序拌列.尊法只flfornj时间安ftn
个活动,便斗多的活动能相零地使用曷曲资淇.
J41累所给岀的活动未按非笑序那列「可以用伪“[唱皿的时囘重那.
1贪婪算法的思想-例4.2活动安排问题
规则:
选择具有最早结束时间的相容活动加入,使剩余的可安排时间最大,以安排尽可能多的活动。
由于输入的活动以其完成时间的非减序排列,所以算法GreedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。
直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。
也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
2可绝对贪婪问题■例4.3
■洞乩3键盘输入一个高稱度的正鳌数N,去掉碁中任意合个数宇启竊下的数字按原左右次序将组成一个新的正整数’编程对给走的N和$•寻找一种方案悄得剰下射数字组威的新数最小.
・输出应包括所去荐的数字的世置和齟成的新的正墾埶N不超过100^).
豹抵酷构设计:
和上一节对高精度正藝数的处理一样,将输入的高稱度数存储为字符串格式.根据输出要或设置数组,在制除数字时记录其豐置士
2可绝对贪婪问题-例43问题分析
通过“枚举归纳卄设计算法,实例<
8=3):
Jn1=*[12435863+|
■盍整策略
U在忖数固走的前提下.让髙位的毂字尽量小其值就辍
=时除商位较大的甄字*
U具体地相撫两位比技若高位比低位大则的除高位U
・n1^12435
fi63"
=4比3大韵除
“123
U23
i5863,T
」E比石犬阴障
i563r,
二6比3大扫除
+,123
I63s
1
3
4
5
6
7
s
9
10
S[l]
a
&
12
€
1C
11
ia
14
例:
设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
例42牯动穽择间题
彈怯型劇谗观r的计算过桦如砸所示・图屮每行相应于尊法的一蝕ft・阴岳低条玮的活动是己选人靠合丄的沼动.而空就条査示的活功是当前正在检査相容社的活动.
1贪婪算法的思想”总结
■适用同肆
□两类
■可绝对盍婪问题
-I求阜忧解;
□具有贪婪进郵性质、阜优子聲构性质;
■相对贪婪问鑒了為到近姒解不算初町
□專近槪解;
一=<
^^题.
□不具备全部性胸,但求解毁率要求高,解的務度要不高'
”
■算法框架
n樓心:
贪婪董略
2可绝对贪婪问题•例43问题分析
■再一个实捌:
□n2-l,231183"
□3比1大斜除“21183“
□2比1大方除“1183"
□8比3大列除"
11
由实例仁相邻数字只需要从前向后比较;
而从实例2中可以看出当第I位与第i巧恒比校,若胡除第i位后,応殖向前考虑第i-1便旨第田位进行比较,才能保证结果的正确枠.
nJ=PFl2J4bbrrs=3
□由这个实例看出,经过对破相邻比较一个数字都没有制除,这就要考虚将后三位进行删除;
□当然还有可能,在相邻比较的过程中曲除的位較小于s时,也要进行相似的操作.
算法设计:
棍据以上实枫分析,揶法主要由四部分组成:
初始化.相嘟数字比较{必要时豹除h处理比较过程中旳除不够S位的情况和结果諭出匕
其中删除字符的实现方注很多,如:
二1)物理进行字符旧除「就是用后面的字符覆盖已帕除的字符,字符率长度改变匕这样可能会有比较茂字符移动操柞,算法效率不高*
二2)可以利用教组记录字符的存在伏态,元素值为,T表示对应数字存在,元素值为沖表示对应数字已對除.这样避免了字符的移动,字符串长度不会改变,可凶省略专门记录拠除数字前位晉*怛这样融前后数字的比较过程和绘后的桂出过程相对复:
杂一些.
3)同样还是利用数组,记录未阳除字符的下标:
頼略的过稈如下:
n=l(12435833"
s=312345678
34比3大删除ff12435833"
1245678
□8比3犬曲除“12435833”12457a
□5比3大网除2435833"
12478
这时数组好霉是数据库中的索引文件=此方式同拝存在探作比轶宜杂的问莎.
贪心算法解决01背包问题:
对于0-1背包问题,贪心选择之所以不能得到最优解是因
为在这种情况下,它无法保证最终能将背包装满,部分闲
置的背包空间使每公斤背包的价值降低了。
//事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。
由此就导出许多互相重叠的子问题。
这正是该问题可用动态规划算法求解的重要特征。
动态规划
动态规划的基本思想:
动态规划方法的基本思想是,把求解的问题分成许多阶段
或多个子问题,然后按顺序求解各子问题。
最后一个子问题就是初始问题的解。
由于动态规划的问题有重叠子问题的特点,为了减少重复
计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
动态规划=贪婪策略+递推(降阶)+存储递推结果
5•空间换取时间
递归隼法64效率低的主要原因是因为进行了犬量的重族计算.而动态规划的基本动机就是充分利用重叠子问題(Overlapping刼以pQUQb期m零h
因为动态嫂划将以前(子问题)计算过时结果都记录下来’遇到便用子问题结果的时像只需査表.
动态规划是一种用空间换取时间的方送匕
因此,动吉规划常常因为空闾消耗衣大而难以实现.
"
适合解决的问题的性质
动态规划第法的问题及决策应该具有两个性质;
最优化原理、无后向性*
□1)最优化匣理(或称为最佳原则、最优子站构);
□2)无后向性(无后效性):
某駙段状态一旦确定以后,就不受这个状态以后决策的影响.即某状态以后的过程不会影响以前的伏态,只与当前狀态有关匕
能够体现动态规划优壹的性质:
□子问题重叠性质;
二动态規划用空间换联时间,在有大量重叠子问题的时餐苴优静才降荒分钵刼出来,
最大字段和的问题:
例5.4求两个字符序列的最长公共字符子序列。
问题分析
若丸的拴度为皿’若B的长度為X则
.4的子序列共有;
+c;
+c;
+-+c:
=2'
-1
E的子序列共有;
—爲+霍—…+c;
=2^-1
如栗用枚毕策略,当m=□时*英谨轩爭比较次数为:
c;
*亡;
--c;
•-,-cJ*c;
耗时
龙多,不可取.
例5.4算法设计
1.逋推关系分析
_^=448o>
S.1-;
..-.tam-i"
1、B="
bo#til*bii-i"
'
眄巧…为它f门的城长公共子序列«
有以下结论;
L)如果ainl^bM亠则Zk-l"
Anl=bn1.且“叫卫上,…疋匕:
“是"
dgl,…/m-广和叫。
血,…,bn-广的一个虽长公共子F?
列:
丄)抑果amH1■则“罚,21,…,Zk-1-'
是
W«
O,B1和,叭虬…山nJ”的一个皋长公共子序列:
3)如果am.lHbn』*且JltdHbml,则“Z。
,Zl7小,1"
是
伽#m…,倉《|-1"
和"
bo,birT.>
的一个量长公共
子序列匕
由此,2牛序列的蛊悅公共子序列包警了这2牛序列的询醍的最良公共予序列*因此*该问题具有嵐优子结构性质.
匕存储、子问題合并
船i]和叩]芬别存储两个字符串’定>
Zc(i][j]为序列
*0鼻1,…冲秤和*ibo,bi,...;
1bj-iw的垠长公共子序列的长度,计j
HU[j]可递归地表述刘下:
1)加山]=0如果i=0或j=0
2)€fi](j]=c[i-ll[j-ll+l如果ij>
O^a[i-l]=b[j-l]
3>
€fi]U]=inai(c[i)U-l],c(L-l]U])如果i.pOhKa[i-l]^b|j-l]
J
j
y-
B
D
A
X>
算
法(递归形式)
intNum=100
chara[Num],b[Num],str[Num];
main()
{intm,n,k;
print(“Enteitwostring”);
input(a,b);
m=strlen(a);
n=strlen(b),k=lcs_len(n,m);
build_lcs(k,n,m);
print(str);
l爲4虹讪仃j)齐计算最优值
{如口竝;
if(i=0orj=0)
elseir(a[i-l]=b[j-l])c[i][j]=lc3_kn(i-l,j-l)+l;
else{titlesr2=lcs
else510=⑵
return^HHjD;
JOfmwn)(UJ):
构造毘长公共子序列境杂度
[if(i=0orj=0)retuiD;
elseif(dllli]=c[i]U-lJ)(MJL);
el5t(就也]=』[i-L];
huttdjn(k-1,i-lj-1);
}}
n=10U
char血ULMMxWl;
曲為3规Ta[],charb[].injt€[][iQ)/计算
{UU叫%ij;
piint(^Entertwostnng"
1);
inputfa.b);
for(i=0:
=mii++)c[i][0]=0:
for(i=0;
i-+)c[0](i)=0;
for(i=l;
=mii++)
for(j=l;
j*=m;
j++)ir(a[i-l]=bU-l])c[i][j]=c[i-l]U-l]+l;
elseif(€[i-lJ[j)>
-c(i]U-l])c[i)Li]=c(i-l)U);
else€[i][j]=c[i]U-l]:
wiilie(k-O)
if<
c[i]U]=c[i-lJUJ^i=i^l;
if<
c[i][j]=c[i]U-l])j=j-l;
else
{k=k-l;
j=j1;
例5・5求一个数列的最长不下降子序列。
设有由11个不相同的整数组城的数列,记为:
a(lha
(2)鹼)且建①吒〉则)(ioj)
若存在il<
i2<
i3<
...勺£
且有a(il)<
a(i2)<
...则称为
託度为K的不下隔序列・
请褊写算法求出一个豹列的最长不下降序列.
例王&
算法设计
1.诵推关系
1)对師血来说,由于它是堆后一个議,所以当从a(u)Jf始查找时,只存在长度肯L的不下阿序列;
2)若从a(n-l)JF始查找,则存在两种可能性:
⑴若机n-1)勺(11)则存在长度対2的不下騒序列a(n-l).a(.n)r⑵若a(ii-l)>
3(n)则存在度为1的不下降序列a(n-l)或机it)*
3)若从;
1⑴开始,此时毎栓不下降序列应按下列方法求出:
在a(i+l)?
a(i+2V..T3{jO中,找出一牛起始数据比日①大的且据长的不下降序列,作育其后继=
匕舉据结构设计用数组b[i]tc[ij分别记垂直i到n的罐长不降子序列的长度和点i后墨数拯编号.
i»
ttun—1oo:
intaruiaxnlnxml?
cTirxaxnj:
maiiiO
tInt
tup11;
fo±
*(1=l.-±
O
<
inpu>
;
lbLU—1;
厂庞分利用tL经得到甬){J结果,避免重篡计士二、算”节吿计算时间
时值]貝杂度了口门宀
ibjs^smnli]=j
i”max_sum2(intntijita[]JntFMJ)
{iRtsum=O;
規加蛮i=1;
it=Rj++)(iratthi仏船期=o;
fprOnJj=!
=!
iJ++如muB+=QUJ;
if(thissurn>
sutn){誓紗期;
b^J=i;
b^sJJ=J;
}returnsum;
例丄7圾大于段率1
离级点丿L的策略;
-该问題不耳缶童娄选疑住展+动态规划
="
划分阶段鼓找出子词题W
n2)选捧扶态;
二3)硒走決策并百出扶态锻穆方叱
」分阶段:
第i阶段得到前i个数字的暈大子段和,
■选痒伏态■伏态转移方程
」当前子段的和:
tNu?
wm[d
this_sum[i-1]+a[i],当thi$_sum[i-1J>
-
自[ih
□绘大子段和:
sum[/]
sumti-IJr
■时间赛杂度?
Q{rj)
■改进:
该问題决策比较简单,是一股的运算,可以直接确
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 五个 重要 特征