算法大作业 第三题

算法大作业 第三题

1. 问题

给定一个源串和目标串,能够对源串进行如下操作:
在任意位置上插入一个字符;
替换任意字符;
删除任意字符。
写一个程序,实现返回最小操作次数,使得对源串进行上述这些
操作后等于目标串(源串和目标串的长度都小于2000)。

2. 解析

该问题我想用动态规划解决
动态规划就是一步步来,先假设目标串只一个字符,两个…直至到真正的长度
开一个二维数组d[i][j]来记录a0-ai与b0-bj之间的编辑距离,要递推时,需要考虑对其中一个字符串的删除操作、插入操作和替换操作分别花费的开销,从中找出一个最小的开销即为所求。
有如下两种情况:
1.如果两个字符串中的第一个字符是相同的,则忽略最后这个字符,然后再同时比较第二个字符,一直比较下去,zhidao1两个字符相同,就进入第二种情况(类似于递归的解决剩余的字符)
2.如果两个字符串中的第一个字符不相同,那么就尝试上述三种操作(插入、替换、删除)使得字符相同。并且为每种可能性递归获取剩余字符串的解决方案,并从中选择最小值min

3. 设计

for (int i=0;i<len_src;++i)
{

		if(source[i]==target[j])//相等
			f[i+1][j+1]=f[i][j];//f矩阵中第1个字符,第2个字符......
		else 
		{
			temp = min(f[i][j]+1,f[i][j+1]+1);
			f[i+1][j+1]=min(f[i+1][j]+1,temp);
			//f[i][j]+1:如果前面f[i][j]是最快的,那么前面的字符不要再动了,现在把第i+1个字符替换成第j+1字符,在给定位置上插入一个字符
			//f[i][j+1]+1:如果前面f[i][j+1]是最快的,那么第i+1个字符是多余的,需要继续保持f[i][j+1]的现状,应该把第i+1个字符删除掉
			//f[i+1][j]+1:如果前面f[i+1][j]是最快的,那么还缺少第j+1个字符,应该插入第j+1个字符
		}
	}

4. 分析

在最坏的情况下:需要对字符串的每个字符执行操作,有3次操作(插入、删除、替换),所以时间复杂度将为O(3 ^ n)。

5. 源码

https://github.com/wubbalubbad/suanfa/blob/main/%E7%AE%97%E6%B3%95%E5%A4%A7%E4%BD%9C%E4%B8%9A%E7%AC%AC%E4%B8%89%E9%A2%98

北航数值分析大作业第二要求使用Python编写一个数值分析算法,并对给定的数值方程进行求解。在解答这道目时,我会按照以下步骤进行。 第一步,我会先了解目给出的数值方程,包括方程的形式、求解的范围以及方程的性质等。这样可以帮助我选择合适的数值分析算法,并为算法实现提供必要的输入。 第二步,我会选择合适的算法来求解数值方程。常见的数值分析算法包括二分法、Newton迭代法、割线法、插值法等。我会根据目的要求和方程的特性选择最合适的算法进行实现。 第三步,我会使用Python编写算法的代码。在编写代码时,我会使用适当的变量和数据结构来表示方程的参数、迭代过程中的中间结果和最终结果等。我会通过循环、条件语句等来控制算法的执行流程,并对方程进行求解。 第四步,我会对代码进行测试和调试。我会准备一些测试用例,包括一些已知答案的方程,以验证算法的正确性。如果发现代码有错误或者不符合预期结果,我会进行调试并进行适当修改。 第五步,我会对算法的效率进行评估。根据目的要求和算法的特性,我会分析算法的时间复杂度和空间复杂度,并进行性能测试。如果发现算法的效率不理想,我会尝试优化算法或选择其他更优的算法来求解数值方程。 最后,我会将代码整理成一个完整的Python程序,并撰写实验报告,说明算法的原理和实现细节,展示代码的运行结果和性能分析,并总结算法的优缺点和改进空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值