編輯距離遞迴方法和非遞迴方法

2021-09-24 00:27:36 字數 1684 閱讀 5731

編輯距離,是指將乙個字串通過修改,刪除,增加三種操作變化為另外乙個字串,編輯距離問題(levensthein)這個過程中要求這三種運算元量最少。編輯距離公式如下:

由此公式可以推導出來遞迴方法:

該方法如下:

#include #include #include namespace wscad 

template inline auto

dist (iter first, iter last) -> distancetype

template inline auto

min (const t& a, const t& b, const t& c) -> const t&

template auto

lev_dist (iter f1, iter l1, iter f2, iter l2) -> distancetype ;

if (f1 == l1) return dist (f2, l2) ;

if (f2 == l2) return dist (f1, l1) ;

cost = (*pred (l1) == *pred (l2)) ? d (0) : d (1) ;

return min

( lev_dist (f1, pred (l1), f2, l2 ) + d (1)

, lev_dist (f1, l1, f2, pred (l2)) + d (1)

, lev_dist (f1, pred (l1), f2, pred (l2)) + cost ) ;

}} // end namespace wscad

int main (int argc, char const* ar** )

該遞迴方法直接有上述公式寫出來的,由於不斷地遞迴,導致演算法效率嚴重降低,故此可以根據上述公式推導出非遞迴方法,利用矩陣進行計算,一般的矩陣計算需要維護m*n的二維陣列,但是以下**並不是通過維護乙個二維陣列矩陣,只是維護了三個一維陣列(m+1),這樣既可以減少空間使用,同事也為下面的平行計算提供了基礎。

該非遞迴方法如下:

void serial_operation(int m, int n, int index, int *l, int *pl, int *pp, std::string str1, std::string str2)

else

for (int i = 1; i <= buffer_size; i++)

}else if (index > n + 1)

}else

}for (int i = 0; i < m + 1; i++)

index++;

}}

其中m是行數,也就是比較短的那個字串str2的長度,

n是列數,較長字串str1的長度

index是斜邊的索引,範圍理論上從0到m+n,但是這裡初始化就是2

l是需要計算的斜邊

pl是l斜邊前面的一條斜邊

pp是pl斜邊前面的一條斜邊

**邏輯如下圖所示:

漢諾塔遞迴方法和非遞迴方法

三個盤子為a,b,c,其中c是中介盤,我們要遵守移動規則將a上的盤子要全部通過b移動到c。include includeusing namespace std define maxsize 50 typedef struct elemtype 順序棧中元素型別 typedef struct stac...

C 遍歷磁碟檔案 非遞迴方法 和遞迴方法

1 非遞迴方法 一起學習 尋找快樂 file name csearch.h pragma once include include include class search file name csearch.cpp include stdafx.h include csearch.h includ...

消除遞迴的方法 遞迴轉非遞迴

利用棧來人工模擬系統堆疊的操作過程,其實這種方法本質上還是遞迴,只不過本來計算機幫你完成的事由你自己做了,所以這對演算法的優化效果不明顯。如果遞迴函式是尾遞迴 在函式末尾遞迴呼叫本函式的方式,且遞迴呼叫語句只有乙個 就可以很容易的將遞迴消除,用推導出來的數學公式代替。其效率與迴圈的 執行效率基本上是...