- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
注释常用算法课件
动态规划
隐马尔可夫模型
聚类;动态规划;13世纪初,欧洲数学家斐波拉契写了一本《算盘书》,以下是其中一个有趣的题目:
“如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月里,又能开始生小兔子,假定在不发生死亡的情况下,由一对初生的兔子开始,1年后能繁殖成多少对兔子?”
把推算得到的头几个数摆成一串。
1,1,2,3,5,8…
这串数隐含着一个规律:从第三个数起,后面的每个数都是它前面两个数的和。按照这个规律推算出来的数,就构成了数学史上有名的数列:“斐波拉契数列”。;抽象成函数:
f(1)=1,f(2)=1,f(3)=2,f(4)=3,f(5)=5,f(6)=8,f(7)=13…f(k)=f(k-1)+f(k-2)
我们可以得出这个序列的递归定义
1 if (n=1) or (n=2)
f(n)=
f(n-1)+f(n-2) if n=3
用伪代码实现以上过程:
1.procedure f(n)
2.if (n=1) or (n=2) then return 1
3.else return f(n-1) + f(n-2);这种递归形式有简明、容易书写和容易查错等优点,最主要的是它的抽象性。但是并不能认为这个递归过程是有效的,相反,由于有许多对过程的重复调用,我们可以把递推式做适当的展开
f(n) = f(n-1) + f(n-2)
=2f(n-2) + f(n-3)
=3f(n-3) + 2f(n-4)
=5f(n-4) + 3f(n-5)
;更有效的方法,应该采用自底向上的计算方法,先从f(1)算起。
1.procedure f(n)
2.if (n=1) or (n=2) then return 1
3.f[1]←1
4.f[2]←1
5.for i ← 3 to n
6. f[i] ← f[i-1] + f[i-2]
7.return f[n];最长公共子序列问题;为了使用动态规划技术,我们首先寻找一个求最长公共子序列长度的递推公式,令A= ,B= ,L[I,j]表示A和B的最长公共子序列的长度。
注意,i和j可能是0,此时, 和 中的一个或同时可能为空字符串。即如果i=0或j=0,那么L[i,j]=0。很容易证明如下结论:
若 = ,L[i,j]=L[i-1,j-1]+1;
若 ,L[i,j]=max{L[i,j-1],L[i-1,j]}
;根据以上推论,可得出如下算法:
1. for i ←0 to n
2. L[i,0] ←0
3. end for
4. for j ←0 to m
5. L[0,j] ←0
6. end for
7. for i ← 1 to n
8. for j ←1 to m
9. if = then L[i,j] ← L[i-1,j-1]+1
10. else L[i,j] ←max{L[i,j-1],L[i-1,j]}
11. end if
12. end for
13.end for
14.return L[n,m]
;设G=(V,E)是一个有向图,其中每条边(i,j)有一个非负的长度l[i,j],如果从顶点i到顶点j没有边,则l[i,j]=∞。问题是要找出从每个顶点到其他所有顶点的距离,这里从顶点x到顶点y的距离是指从x到y的最短路径的长度。
我们假设V={1,2,…,n},设i和j是V中两个不同的顶点,定义 是从i到j,并且不经过{k+1,k+2,…,n}中任何顶点的最短路径的长度。
根据这个定义,可以递归地计算 如下:
l[i,j] 若k=0
=
min{ , + } 若1=k=n
;FLOYD算法:
1. D←l {将输入矩阵l复制到D}
2. for k ←1 to n
3. for i ←1 to n
4. for j ←1 to n
5. D[i,j]=min{D[i,j],D[i,k]+D[k,j]}
6. end for
7. end for
8.end
文档评论(0)