数据结构与算法专题——第四题 字符串相似度
這篇我們看看?最長(zhǎng)公共子序列?的另一個(gè)版本,求字符串相似度(編輯距離),我也說過了,這是一個(gè)非常實(shí)用的算法,在DNA對(duì)比,網(wǎng)頁聚類等方面都有用武之地。
一:概念
對(duì)于兩個(gè)字符串 A 和 B,通過基本的增刪改將字符串 A 改成 B,或者將 B 改成 A,在改變的過程中使用的最少步驟稱之為:?編輯距離。比如如下的字符串:我們通過種種操作,痙攣之后編輯距離為3,不知道你看出來了沒有?
二:解析
可能大家覺得有點(diǎn)復(fù)雜,不好理解,我試著把這個(gè)大問題拆分掉,將?字符串 vs 字符串,分解成?字符 vs 字符串,再分解成字符 vs 字符。
1. 字符 vs 字符
這種情況是最簡(jiǎn)單的了,比如 A 與 B 的編輯距離很顯然是1。
2. 字符 vs 字符串
A 改成 AB 的編輯距離為1,A 與 ABA 的編輯距離為2。
3. 字符串 vs 字符串
ABA 和 BBA 的編輯距離為1,仔細(xì)發(fā)現(xiàn)可以得出如下結(jié)論,ABA 是由2^3個(gè)子序列與 BBA 字符串求的的編輯距離集合中取出的最小編輯距離,也就是說在這種情況下我們出現(xiàn)了重復(fù)計(jì)算的情況,我在求子序列 AB 和 BBA 的編輯距離時(shí),我是由子序列 A 和 BBA 與 B 和 BBA 之間的編輯距離中選出一個(gè)最小值,然而序列A和序列B早之前我已經(jīng)計(jì)算過了,這種重復(fù)計(jì)算的問題有點(diǎn)像?斐波那契,正好滿足動(dòng)態(tài)規(guī)劃中的最優(yōu)子結(jié)構(gòu)和重疊子問題,所以我決定采用動(dòng)態(tài)規(guī)劃來解決。
三:公式
跟最長(zhǎng)公共子序列一樣,可以采用一個(gè)二維數(shù)組來保存字符串 X 和 Y 當(dāng)前的位置的最小編輯距離。現(xiàn)有兩個(gè)序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi}。
設(shè)一個(gè)C[i,j]: 保存Xi與Yj的當(dāng)前最小的LD。
1. 當(dāng) Xi = Yi 時(shí),則C[i,j]=C[i-1,j-1];
2. 當(dāng) Xi != Yi 時(shí), 則C[i,j]=Min{C[i-1,j-1],C[i-1,j],C[i,j-1]};
最終我們的C[i,j]一直保存著最小的LD。
四:代碼
using System;namespace ConsoleApplication2 {public class Program{static int[,] martix;static string str1 = string.Empty;static string str2 = string.Empty;static void Main(string[] args){while (true){str1 = Console.ReadLine();str2 = Console.ReadLine();martix = new int[str1.Length + 1, str2.Length + 1];Console.WriteLine("字符串 {0} 和 {1} 的編輯距離為:{2}\n", str1, str2, LD());}}/// <summary>/// 計(jì)算字符串的編輯距離/// </summary>/// <returns></returns>public static int LD(){//初始化邊界值(忽略計(jì)算時(shí)的邊界情況)for (int i = 0; i <= str1.Length; i++){martix[i, 0] = i;}for (int j = 0; j <= str2.Length; j++){martix[0, j] = j;}//矩陣的 X 坐標(biāo)for (int i = 1; i <= str1.Length; i++){//矩陣的 Y 坐標(biāo)for (int j = 1; j <= str2.Length; j++){//相等情況if (str1[i - 1] == str2[j - 1]){martix[i, j] = martix[i - 1, j - 1];}else{//取“左前方”,“上方”,“左方“的最小值var temp1 = Math.Min(martix[i - 1, j], martix[i, j - 1]);//獲取最小值var min = Math.Min(temp1, martix[i - 1, j - 1]);martix[i, j] = min + 1;}}}//返回字符串的編輯距離return martix[str1.Length, str2.Length];}} }總結(jié)
以上是生活随笔為你收集整理的数据结构与算法专题——第四题 字符串相似度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeetleX.FastHttpApi之
- 下一篇: [温故知新] 编程原则和模式