日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法专题——第四题 字符串相似度

發(fā)布時(shí)間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法专题——第四题 字符串相似度 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇我們看看?最長(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。