算法设计与分析:2-Lec6-EditDistance.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
### 算法设计与分析:编辑距离 #### 动态规划 本文介绍了动态规划的概念及其在解决具有大量重叠子问题情况下的优化问题的效率。动态规划的核心思想是通过重组子问题的解来解决问题,并且当子问题本身可能具有相同的子子问题时,动态规划能够避免重复计算,通过存储已经计算过的函数值来实现。 动态规划与计算机科学中的“编程”概念不同,它不是一个编程语言或编程技巧,而是一种算法策略。动态规划解决问题的步骤可以总结为: 1. 创建一个正确维度的表格来描述问题。 2. 填充表格,重用之前的子问题解。 一个典型例子是计算斐波那契数列。斐波那契数列定义为:F(n) = F(n-1) + F(n-2),其中F(0)=0, F(1)=1。非动态规划方法实现斐波那契数列的函数会涉及大量的重复计算,例如fib(8)会产生大量的函数调用。而动态规划方法则通过记忆化(memoization)或使用表格来存储已计算的值,避免了这种重复计算。 #### 斐波那契数列的动态规划实现 利用动态规划计算斐波那契数列的方法,可以避免递归中的重复计算。一种方式是使用字典来存储计算过的斐波那契数: ```python table = {} def fib(n): global table if table.has_key(n): return table[n] if n == 0 or n == 1: table[n] = n return n else: value = fib(n-1) + fib(n-2) table[n] = value return value ``` 另一种方式是使用列表(数组)来存储计算过的斐波那契数,这通常在空间效率上更优: ```python def fib(n): table = [0] * (n+1) table[0] = 0 table[1] = 1 for i in range(2, n+1): table[i] = table[i-2] + table[i-1] return table[n] ``` 在后续的课程中,我们会多次看到类似的模式:创建一个表格来记录问题的状态,并重用子问题的解。 #### 字符串编辑距离(String Edit Distance) 字符串编辑距离是用来衡量两个字符串(序列)之间的“距离”的一种度量。这个距离表示将一个字符串转换成另一个字符串所需要的最小字符编辑操作的数目。常见的编辑操作包括: - 将一个字符替换为另一个字符(substitute) - 删除一个字符(delete) - 插入一个字符(insert) 例如,字符串 "zoo" 和 "z" 的编辑距离为 2,因为需要进行两次编辑操作:删除一个 'o' 和另一个 'o'。 编辑距离问题非常适合使用动态规划来解决。动态规划方法通过构建一个表格,其中的每个条目对应于输入字符串中某个前缀的编辑距离。然后通过填充这个表格,可以构建出整个编辑距离的最优解。编辑距离问题的动态规划解法将展示如何创建表格,并利用子问题的解来填写表格,避免不必要的计算。 编辑距离的应用非常广泛,它是自然语言处理、生物信息学和许多其他领域中的一个基本工具,用于衡量序列相似度或进行字符串匹配。
- 粉丝: 25
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助