算法设计与分析课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩评定表
课程设计任务书
摘要
算法设计与分析,其实可以解释为一类优化问题,一般针对可以利用计算机解决的离散型问题的优化。主要目的就是为了解决某一问题而提出各种不同的解决方案,并且要针对具体的问题做细致的空间和时间复杂度分析。所有的算法中,应该尽量选取“好”的算法,这里所说的“好”,首先是正确的,其次是所选算法解决问题的效率要尽可能的高。计算机计算时间的长短以及所用空间的大小,跟算法有直接关系,用来衡量算法好坏的两个重要标准就是就是时间和空间复杂度,所以提出好的解决方案,其算法是重中之重。
动态规划算法是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。首先找出最优解的性质,并刻其结构特征,然后递归的定义最优值(写出动态规划方程)并且以自底向上的方式计算出最优值,最后根据计算最优值时得到的信息,构造一个最优解。
分支限界法类似于回溯法,也是在问题的解空间上搜索问题解的算法。一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。分支限界法的搜索策略是,在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。这种方式称为分支限界法。人们已经用分支限界法解决了大量离散最优化的问题。
关键词:动态规划分支限界法编辑距离问题 0-1背包问题
目录
1.动态规划法解决编辑距离问题 (1)
1.1问题描述 (1)
1.2问题分仔 (1)
1.3算法设计 (2)
1.4算法实现 (3)
1.5结果分析 (5)
1.6复杂度分析 (5)
2.分支限界法解决0-1背包问题 (6)
2.1问题描述 (6)
2.2问题分析 (6)
2.3算法设计 (7)
2.4算法实现 (7)
2.5结果分析 (12)
2.6 复杂度分析 (12)
3.参考文献 (13)
1.动态规划法解决编辑距离问题
1.1问题描述
设A 和B 是2个字符串。要用最少的字符操作将A 转换为字符串B 。这里所说的字符操作包括:(1)删除一个字符;(2)插入一个字符:(3)将一个字符改为另一个字符。
将字符串A 变换为字符串B 所用的最少字符操作数称为字符串A 到B 的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2个字符串A 和B ,计算其编辑距离d (A,B )。
1.2问题分仔
设所给的两个字符串为A[1:m]和B[1:n],定义一个二维数组dp[i][j]表示状态,dp[i][j]= (A[1:i],B[1:j])表示字符串A[1:m]的子串A[1:i]变换到B[1:n]的子串B[1:j]的编辑距离,即子串A[1:i]至少要经过多少次操作(插入、删除、修改)可以变为B[1:j]。单字符a,b 间的编辑距离定义为
例如,字符串A:AGTAAGTAGGC 转换为 字符串B:AGTCTGACGC 。
操作一:A 串:A G T A A G T * A G G C B 串:A G T * C * T G A C G C 需要5步操作(2次删除,2次修改,1次删除) 操作二:A 串:A G T A A G T A G G C B 串:A G T C T G * A C G C 需要4次操作(3次修改,1次删除)
我们计算的编辑距离是变换的最小步数,所以要取其中的最小值。
考察从字符串A[1:i]到字符串B[1:j]的转换,有三种情况可以导致上面设计的状态发生转移:
()⎩⎨
⎧≠==b
a b
a b a d ,1,0,
(1)可以删除字符A[i]需要1次操作。只将字符A[i]从A串中删除,对序列B[1:j]没有任何影响,此时问题的最优子结构形式为将A[1:i-1] 变为B[1:j] ,再加一步删除操作,可得dp[i][j] = dp[i-1][j] + 1。
(2)可以在A[i]后面插入一个字符ch(ch==B[j])需要1次操作。在进行插入操作时,串A[1:i] 无任何变化,在A串i+1
位置上插入字符B[j],问题的最优子结构形式为将A[1:i]变
为B[1:j-1],再加一步插入操作,可得dp[i][j] = dp[i ][j-1] + 1。
(3)可以修改字符A[i],使它变为B[j],若A[i]=B[j],修改
其实相当于用了0步;若A[i] != B[j],修改相当于用了1步。
所以dp[i][j] = dp[i - 1][j - 1] + (A[i] == B[j] ? 0:1)。
最后的dp[i][j]就是选择上述3种状态转移中的最小值。
综上所述,状态转移方程dp[i][j]可归结为如下情况:
(1)当两个字符相同,即A[i]=B[j]时,
dp[i][j] = min{dp[i][j-1]+1, dp[i-1][j]+1, dp[i-1][j-1]}
(2)当两个字符不同,即A[i] != B[j]时,
dp[i][j] = min{dp[i][j-1]+1, dp[i-1][j]+1, dp[i-1][j-1]+1}
需要注意的是,要对dp[0][0:m],dp[0:n][0]进行初始化。
*dp[0][i],就是说A串是一个空串,而B串是个长度为i的串,很显然A串变为B串就是插入i个字符,即dp[0][i]=i。
*dp[i][0] ,就是说A串是个长度为i的串,而B串是一个空串,很显然A串变为B串就是删除i个字符,即dp[i][0]=i。
1.3算法设计
数据输入:输入数据的第一行是一个正整数,表示一共有几组数据。每组数据两行,每行一个字符串。
*每个字符串长度不超过1000
结果输出:输出编辑距离。对于每组数据,请输出一个整数表示两个字符串的编辑距离。每个答案占一行。