欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Go語(yǔ)言計(jì)算字符串編輯距離的代碼實(shí)現(xiàn)

 更新時(shí)間:2025年07月29日 08:30:26   作者:程序員愛(ài)釣魚(yú)  
在自然語(yǔ)言處理、拼寫(xiě)糾錯(cuò)、模糊搜索等場(chǎng)景中,我們經(jīng)常需要衡量?jī)蓚€(gè)字符串之間的相似度,編輯距離(Edit Distance)  就是一個(gè)經(jīng)典的衡量方式,它描述了將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的最少操作次數(shù),本文給大家介紹了如何使用Go語(yǔ)言計(jì)算字符串編輯距離

一、問(wèn)題定義:什么是編輯距離?

編輯距離,也稱(chēng)為 Levenshtein Distance,指的是將字符串 A 轉(zhuǎn)換成字符串 B 所需的最少操作次數(shù)。操作允許:

  • • 插入一個(gè)字符(Insert)
  • • 刪除一個(gè)字符(Delete)
  • • 替換一個(gè)字符(Replace)

示例:

A?=?"kitten"
B?=?"sitting"

編輯距離?=?3
解釋?zhuān)?
kitten?→?sitten(k?→?s)?→?sittin(e?→?i)→?sitting(插入?g)

二、應(yīng)用場(chǎng)景

編輯距離廣泛應(yīng)用于:

  • • 搜索引擎模糊匹配(例如:“gooogle” 應(yīng)該匹配 “google”)
  • • 拼寫(xiě)檢查和自動(dòng)糾正
  • • 語(yǔ)音識(shí)別、OCR糾錯(cuò)
  • • DNA序列比對(duì)

三、解決思路:動(dòng)態(tài)規(guī)劃(DP)

1. 狀態(tài)定義

設(shè) dp[i][j] 表示將字符串 A 的前 i 個(gè)字符轉(zhuǎn)換成字符串 B 的前 j 個(gè)字符所需的最小操作數(shù)。

2. 狀態(tài)轉(zhuǎn)移方程

我們可以從三個(gè)方向轉(zhuǎn)移過(guò)來(lái):

  • 插入:dp[i][j-1] + 1(B 多了個(gè)字符)
  • 刪除:dp[i-1][j] + 1(A 多了個(gè)字符)
  • 替換或匹配:dp[i-1][j-1] + cost
    • 如果 A[i-1] == B[j-1],cost = 0
    • 否則 cost = 1

最終狀態(tài)轉(zhuǎn)移為:

dp[i][j]?=?min(
????dp[i-1][j]?+?1,??????????//?刪除
????dp[i][j-1]?+?1,??????????//?插入
????dp[i-1][j-1]?+?cost??????//?替換/匹配
)

3. 初始化

  • dp[0][j] = j:將空串變成 B 前 j 個(gè)字符需要插入 j 次;
  • dp[i][0] = i:將 A 前 i 個(gè)字符變成空串需要?jiǎng)h除 i 次。

四、Go語(yǔ)言實(shí)現(xiàn)

動(dòng)態(tài)規(guī)劃二維實(shí)現(xiàn):

package?main

import?(
????"fmt"
????"math"
)

func?MinDistance(a,?b?string)?int?{
????m,?n?:=?len(a),?len(b)
????dp?:=?make([][]int,?m+1)

????//?初始化二維數(shù)組
????for?i?:=?range?dp?{
????????dp[i]?=?make([]int,?n+1)
????}

????//?初始化第一列和第一行
????for?i?:=?0;?i?<=?m;?i++?{
????????dp[i][0]?=?i
????}
????for?j?:=?0;?j?<=?n;?j++?{
????????dp[0][j]?=?j
????}

????//?狀態(tài)轉(zhuǎn)移
????for?i?:=?1;?i?<=?m;?i++?{
????????for?j?:=?1;?j?<=?n;?j++?{
????????????cost?:=?0
????????????if?a[i-1]?!=?b[j-1]?{
????????????????cost?=?1
????????????}
????????????dp[i][j]?=?min(
????????????????dp[i-1][j]+1,???//?刪除
????????????????dp[i][j-1]+1,???//?插入
????????????????dp[i-1][j-1]+cost,?//?替換/匹配
????????????)
????????}
????}

????return?dp[m][n]
}

func?min(a,?b,?c?int)?int?{
????return?int(math.Min(float64(a),?math.Min(float64(b),?float64(c))))
}

func?main()?{
????a?:=?"kitten"
????b?:=?"sitting"
????fmt.Printf("編輯距離?between?'%s'?and?'%s'?is:?%d\n",?a,?b,?MinDistance(a,?b))
}

五、運(yùn)行示例

輸入:
a?=?"kitten"
b?=?"sitting"

輸出:
編輯距離?between?'kitten'?and?'sitting'?is:?3

六、時(shí)間與空間復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(m * n)
    因?yàn)槲覀儽闅v了大小為 m x n 的二維數(shù)組;
  • 空間復(fù)雜度:O(m * n)
    用于存儲(chǔ)狀態(tài)的二維數(shù)組。

七、空間優(yōu)化版本(滾動(dòng)數(shù)組)

可以?xún)?yōu)化為一維數(shù)組來(lái)降低空間:

func?MinDistanceOptimized(a,?b?string)?int?{
????m,?n?:=?len(a),?len(b)
????prev?:=?make([]int,?n+1)
????curr?:=?make([]int,?n+1)

????//?初始化第一行
????for?j?:=?0;?j?<=?n;?j++?{
????????prev[j]?=?j
????}

????for?i?:=?1;?i?<=?m;?i++?{
????????curr[0]?=?i
????????for?j?:=?1;?j?<=?n;?j++?{
????????????cost?:=?0
????????????if?a[i-1]?!=?b[j-1]?{
????????????????cost?=?1
????????????}
????????????curr[j]?=?min(
????????????????curr[j-1]+1,??????//?插入
????????????????prev[j]+1,????????//?刪除
????????????????prev[j-1]+cost,???//?替換
????????????)
????????}
????????prev,?curr?=?curr,?prev
????}

????return?prev[n]
}

八、拓展:支持更多操作的變種編輯距離

  • Damerau-Levenshtein 距離:除了插入、刪除、替換,還支持交換相鄰字符;
  • 帶權(quán)重的編輯距離:不同操作賦予不同代價(jià);
  • 相似度計(jì)算:將編輯距離轉(zhuǎn)為百分比相似度,比如:
similarity?:=?1?-?float64(distance)?/?float64(max(len(a),?len(b)))

九、實(shí)戰(zhàn)應(yīng)用場(chǎng)景舉例

場(chǎng)景作用描述
搜索引擎用戶(hù)輸入有誤時(shí)自動(dòng)推薦相似關(guān)鍵詞
拼寫(xiě)檢查IDE、文本編輯器糾正英文單詞
語(yǔ)音/圖像識(shí)別后處理自動(dòng)修正識(shí)別錯(cuò)誤的單詞序列
文件比對(duì)工具如 Git diff、文本比較器
生物信息學(xué)DNA/RNA 序列比對(duì)、蛋白質(zhì)比對(duì)

十、總結(jié)

點(diǎn)位內(nèi)容
算法思想動(dòng)態(tài)規(guī)劃
實(shí)現(xiàn)結(jié)構(gòu)dp[i][j] 表示 A 的前 i 個(gè)字符轉(zhuǎn)換為 B 的前 j 個(gè)字符的最小編輯距離
時(shí)間復(fù)雜度O(m * n)
空間優(yōu)化支持優(yōu)化為滾動(dòng)數(shù)組,空間降為 O(n)
實(shí)戰(zhàn)價(jià)值應(yīng)用場(chǎng)景極廣,從 NLP 到搜索再到生物信息學(xué)

以上就是使用Go語(yǔ)言計(jì)算字符串編輯距離的代碼實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Go計(jì)算字符串編輯距離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang判斷結(jié)構(gòu)體為空的問(wèn)題

    golang判斷結(jié)構(gòu)體為空的問(wèn)題

    這篇文章主要介紹了golang判斷結(jié)構(gòu)體為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn)

    Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn)

    defer是Go語(yǔ)言的關(guān)鍵字,一般用于資源的釋放和異常的捕捉,defer語(yǔ)句后將其后面跟隨的語(yǔ)句進(jìn)行延遲處理,就是說(shuō)在函數(shù)執(zhí)行完畢后再執(zhí)行調(diào)用,也就是return的ret指令之前,本文給大家介紹了Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11
  • 淺談一下前端http與https有什么區(qū)別

    淺談一下前端http與https有什么區(qū)別

    這篇文章主要介紹了淺談一下前端http與https有什么區(qū)別,現(xiàn)今大部分的網(wǎng)站都已經(jīng)使用了 https 協(xié)議,那么https對(duì)比http協(xié)議有哪些不同呢,需要的朋友可以參考下
    2023-04-04
  • Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法詳解

    Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于Golang中數(shù)據(jù)結(jié)構(gòu)Queue的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Go語(yǔ)言中進(jìn)行API限流的實(shí)戰(zhàn)詳解

    Go語(yǔ)言中進(jìn)行API限流的實(shí)戰(zhàn)詳解

    API?限流是控制和管理應(yīng)用程序訪問(wèn)量的重要手段,旨在防止惡意濫用、保護(hù)后端服務(wù)的穩(wěn)定性和可用性,下面我們就來(lái)看看如何在Go語(yǔ)言中具體實(shí)現(xiàn)吧
    2025-01-01
  • Go?Excelize?API源碼閱讀SetSheetViewOptions示例解析

    Go?Excelize?API源碼閱讀SetSheetViewOptions示例解析

    這篇文章主要為大家介紹了Go-Excelize?API源碼閱讀SetSheetViewOptions示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 如何利用golang運(yùn)用mysql數(shù)據(jù)庫(kù)

    如何利用golang運(yùn)用mysql數(shù)據(jù)庫(kù)

    這篇文章主要介紹了如何利用golang運(yùn)用mysql數(shù)據(jù)庫(kù),文章對(duì)依賴(lài)包、db對(duì)象注入ApiRouter等內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • go語(yǔ)言開(kāi)發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法

    go語(yǔ)言開(kāi)發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法

    這篇文章主要為大家介紹了go語(yǔ)言開(kāi)發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go?編程復(fù)雜數(shù)據(jù)類(lèi)型?Map

    Go?編程復(fù)雜數(shù)據(jù)類(lèi)型?Map

    這篇文章主要介紹了Go編程復(fù)雜數(shù)據(jù)類(lèi)型Map,Go中的Map是一組無(wú)需的K-V類(lèi)型的數(shù)據(jù),與Python中的字典Dict和Java中的HashMap結(jié)構(gòu)類(lèi)似。未被初始化的Map為nil
    2022-08-08
  • Go 1.21新增的slices包中切片函數(shù)用法詳解

    Go 1.21新增的slices包中切片函數(shù)用法詳解

    Go 1.21新增的 slices 包提供了很多和切片相關(guān)的函數(shù),可以用于任何類(lèi)型的切片,本文通過(guò)代碼示例為大家介紹了部分切片函數(shù)的具體用法,感興趣的小伙伴可以了解一下
    2023-08-08

最新評(píng)論