代码链接:pan.baidu.com/s/1rIugypf7lhUTfwdAG0Gv_w
码:w38a
算法分析与设计 | |||||
时间 | 2020.4.23 | ||||
实验名称 | 字符串比较问题 | ||||
实验目的 | 通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。 | ||||
实验原理 | 设计一个算法,利用动态规划法的思想,根据题目所给出的条件,求出最长字符匹配距离。 | ||||
实验步骤 | 问题分析:最优子结构: 设字符串A和B的子串A[1..i]和B[1..j]的扩展距离为val(i,j),表示A字符串已经匹配到第i位,B字符串已经匹配到第j位,则有三种情况:
由此可见,求两个字符串的扩展距离需要得到其子串的扩展距离,该问题具备最优子结构。 扩展距离的递归式为:
求解步骤①读取数据文件 ②自底向上构造最优值: 对字符串A中的每一个字符与字符串B的每一个字符做顺序处理,根据动规方程,判断三种情况得到的val[i][j]的最小值即为该子问题的最优解(因为val[i][j]仅由val[i-1][j]、val[i-1][j]、val[i-1][j]这三个已经处理过的最优解决定并且不会反过来影响它们三个的最优解(汽车优化问题就是因为当前解的求解会反过来影响已经处理过的解因此才需要进行最优解判断)); | ||||
关键代码 | 关键代码(带注释)1. 字符间距离求解
分为空格与字符、字符与字符、空格与空格三种情况; 2. 动态规划过程
以上是完全根据状态转移方程写出的代码; 需要注意的是val[0][0]初始化为0,该状态不是子问题,在if语句中i+j为真保证不处理val[0][0]这个点,第一个(i*j)保证处理val[i][j]所需要的val[i-1][j-1]不会越界;, | ||||
测试结果 | 运行结果截图及分析对于题目样例:运行无误; 时间复杂度分析:这个算法主要是要遍历每一个格子(也即每一种情况),这与两个字符串的长度有关。同时对于每一个格子都存在三种情况,我们需要比较找出最优值。 设字符串长度分别为L1,L2。 则算法时间复杂度为O(L1*L2)。 空间上的开销就是这个二维数组(所有的格子)。 则空间复杂度也为O(L1*L2)。 | ||||
实验心得 | 通过这个实验与上一个实验的比较不难发现一个问题,那就是子问题的解不一定只求解一次,汽车行驶问题就有可能会出现多次修改子问题的解才能求得最优解;而判断需不需要多次求解的方法也很简单,就是看当前子问题的解的改变是否会影响到之前已经处理过的子问题的解。比如字符比较问题这里的解完全是由之前子问题的解求得的,完全无法改变已经求得的子问题的解,因此子问题的解求解只需一次,求得的就是最优解; |