1. 程式人生 > >【演算法】樹的編輯距離

【演算法】樹的編輯距離

    字串編輯距離定義了一個從字串轉換到另一個字串最少需要的操作次數,操作次數越少,則從側面證明兩個字串較為相似,它從新的角度定義了兩個事物相似度的計算方法,這種事物並不僅限於字串,也可以是其他結構比如樹。

樹的編輯操作同樣有三種:

1.插入:向一顆樹中插入一個節點;

2.刪除:從一棵樹中刪除一個節點;

3.轉換:將一棵樹中的節點轉換為其他的節點。

    計算樹的編輯距離就是求從一棵樹轉換為另一棵樹所需要樹的編輯操作的最少次數。

    假設現在對兩棵樹T和T’求解編輯距離,首先要找到他們之間的對映,也就是相同的部分,然後再對不同的部分進行操作進行轉換。

    上圖是T和T'之間的對映圖,T中沒有虛線連線的點是需要刪除的點,T'中沒有虛線連線的點是需要插入的點,虛線連線的若是不同的兩個點則進行轉換操作,若連線的是相同的點則不進行任何操作。虛線連線的部分稱為對映,它可以用一個三元組(M,T,T')來表示,M(i,j)表示T中節點i和T'中節點j的對映,i和j滿足以下關係:

1. 1<=i<=|T|,1<=j<=|T'|;

2.對於M(i1,j1)和M(i2,j2):

    i1=i2當且僅當j1=j2;

    i1<i2當且僅當j1<j2;

    T[i1]是T[i2]的祖先或後繼節點當且僅當T'[j1]是T'[j2]的祖先或後繼節點。

令M為T到T'的一個對映,I和J分別為T和T'中未連線的節點,則對映代價可以用如下公式表示:

上式的三個部分分別對應轉換、刪除、插入的編輯代價,T和T'的編輯距離可以通過計算cost(M)得到。

    該演算法基於字串的編輯距離演算法的啟發,定義了從一棵樹轉換為另一棵樹的三種基本操作,並稱這些操作的最少次數為樹的編輯距離該演算法採用動態規劃的方法,從根節點出發,每次比較上一層已經配對的節點的兒子節點,確定本層節點的一個最佳的對應關係,也就是找到兩棵樹之間當前層最相似的兒子節點,而沒有參與到對應關係的節點則產生距離。由於該演算法只需對兩棵樹同一層節點的相似度進行考慮,極大地簡化了問題,所以有O(nr)的最壞時間複雜度,其中n代表書中節點個數,r代表樹中節點平均兒子數。

相關推薦

演算法編輯距離

    字串編輯距離定義了一個從字串轉換到另一個字串最少需要的操作次數,操作次數越少,則從側面證明兩個字串較為相似,它從新的角度定義了兩個事物相似度的計算方法,這種事物並不僅限於字串,也可以是其他結構比如樹。樹的編輯操作同樣有三種:1.插入:向一顆樹中插入一個節點;2.刪除:

Leetcode72.編輯距離

題目 給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。你可以對一個單詞進行如下三種操作: 插入一個字元 刪除一個字元 替換一個字元 示例 1: 輸入: word1 = "horse", word2 = "ro

動態規劃字串編輯距離(Levenshtein距離演算法

基本介紹 Levenshtein距離是一種計算兩個字串間的差異程度的字串度量(string metric)。我們可以認為Levenshtein距離就是從一個字串修改到另一個字串時,其中編輯單個字元(比如修改、插入、刪除)所需要的最少次數。俄羅斯科學家Vladi

演算法二叉前序、中序、後序遍歷相互求法(轉)

二叉樹前序、中序、後序遍歷相互求法 原文地址      今天來總結下二叉樹前序、中序、後序遍歷相互求法,即如果知道兩個的遍歷,如何求第三種遍歷方法,比較笨的方法是畫出來二叉樹,然後根據各種遍歷不同的特性來求,也可以程式設計求出,下面我們分別說明。  

演算法二叉的遞迴和非遞迴遍歷(轉)

原文地址 【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採

演算法二叉的廣度遍歷

廣度優先遍歷的核心思想如下:從根節點開始遍歷,然後遍歷其子節點,再從左至右的,依次遍歷其孫子節點的,以此類推,直到完成整顆二叉樹的遍歷。          50    20        &nbs

演算法線段

之前由於不會延遲標記一直沒寫這題。 那麼今天就寫一個總結來加深印象吧! 首先,延遲標記的作用就是在於當某個區間遭到改變,但又用不上(不用輸出)時。將所有先前改變都標記上去,等到要用到了,一次直接改。 #include <bits/stdc++.h> #define m

Leetcode_總結72. 編輯距離 - python

Q: 給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。 你可以對一個單詞進行如下三種操作: 插入一個字元 刪除一個字元 替換一個字元

演算法把字串轉換成整數,中兩個結點的最低公共祖先

本書最後的兩道題,作者拿了兩個面試案例來呈現,主要是要弄清面試官的意圖、考慮周全,有些演算法雖然容易,不要輕易下手。在此之上最好寫出具有魯棒性的和好的擴充套件性的程式碼,遵循編碼規範。 面試題67:把字串轉換成整數 請你寫一個函式StrToInt,實現把字串轉

演算法python實現二叉搜尋插入、刪除、查詢

二叉搜尋樹 定義:如果一顆二叉樹的每個節點對應一個關鍵碼值,且關鍵碼值的組織是有順序的,例如左子節點值小於父節點值,父節點值小於右子節點值,則這棵二叉樹是一棵二叉搜尋樹。 類(TreeNode):定義二叉搜尋樹各個節點 在該類中,分別存放節點本身的值,以及其左子節點,右子節點,父節點的值。   clas

演算法B+的研讀及實現(1)

【前言】 為什麼要明白b+樹?假如大家有操作資料庫及開發有關資料庫的經驗,那麼肯定知道索引這個概念,那麼進一步問你什麼叫索引? mysql的索引就是B+樹,而其他資料庫我不太清楚,但是,b+樹是一般的索引演算法,當然,oracle、postgres等資料庫聽說也支援r樹的索

演算法B+的研讀及實現(2)---java版核心程式碼

【前言】 假如大家已經弄懂了b樹及b+樹那麼恭喜你們了,因為我覺得,b樹及b+樹是檔案系統尤其是資料庫優化的關鍵。 這裡預告一下,下一篇課題(也不能說課題,只能用“業餘研究題目”這種稱呼)是R樹,R樹似乎是多維的B+樹,各位假如也希望弄懂R樹的話,請先好好看看b+樹。

演算法b的實現(1)

【前言】 這個內容是重點,因為它涉及到資料庫的儲存方式,查詢效率等。 先埋坑,到時候有時間再填上去。 還有一篇文章,裡面詳細講述了刪除節點的幾種情況: 【勘誤】我推薦的第二篇文章針對需要合併操作的操作是錯誤的,原因是作者沒有考慮到當父節點不夠數(譬如:5階數,關鍵

演算法紅黑插入資料的情況與實現(三)

大家如果有玩魔方,我相信是可以理解我說的東西的,轉魔方就是先把第一面轉出來,然後把第一面作為底面,然後根據遇見的情況來轉魔方(是有公式的) 該系列到現在暫只有3篇文章:   【演算法】紅黑樹(二叉樹)概念與查詢(一):https://blog.csdn.net/lsr40/ar

演算法紅黑插入資料(變色,左旋、右旋)(二)

本人菜雞一隻,正在更新紅黑樹系列的文章。 該系列到現在暫只有3篇文章:   【演算法】紅黑樹(二叉樹)概念與查詢(一):https://blog.csdn.net/lsr40/article/details/85230703 【演算法】紅黑樹插入資料(變色,左旋、右旋)(二

演算法紅黑(二叉)概念與查詢(一)

誒,演算法這個東西,其實沒那麼簡單,但是也沒那麼難。 紅黑樹,其實已經有很多大佬都整理過了,而且文章部落格都寫得超好,我寫這篇文章的目的是:自己整理一次,這些知識才是自己的,否則永遠是別人的~   該系列到現在暫只有3篇文章: 【演算法】紅黑樹(二叉樹)概念與查詢(一):h

LeetCode漢明距離演算法及運用

1、什麼是漢明距離  漢明距離,從二進位制方面來看,就是兩個等長字串的二進位制對應 bit 不相同的位個數,例如 1011 1000 //漢明距離為2 1100 1010 //漢明距離是2 2.計算漢明距離的演算法  思路:   01.將兩個給定的數進行

演算法java版紅黑演算法的完整實現及swing介面演示程式

【前言】 當初因為覺得資料結構及演算法是碼農的基礎(正如鋤頭對農民一樣)才決定話費時間來補習的,但是真正自行實現演算法及演算法的視覺化演示的時候才發現難度是如此之大。 演算法寫起來慢,swing介面寫起來也慢。 紅黑樹的結構最重要就是幾個規則: 1、根節點為黑色,NIL

演算法決策,資訊熵,資訊增益,Gini

決策樹演算法中,ID3使用資訊增益(選大的),C4.5使用資訊增益比(選大的),CART使用Gini(選小的)。決策樹是通過一系列規則對資料進行分類的過程。它提供一種在什麼條件下會得到什麼值的類似規則的方法。決策樹分為分類樹和迴歸樹兩種,分類樹對離散變數做決策樹,迴歸樹對連續

演算法紅黑的講解及插入刪除演算法實現原理

【轉】【經典】 導讀:    linux核心中的使用者態地址空間管理使用了紅黑樹(red-black tree)這種資料結構,我想一定有許多人在這種資料結構上感到困惑,我也曾經為此查閱了許多資料以便了解紅黑樹的原理。最近我在一個外國網站上看到一篇 講解紅黑樹的文章,覺得相當不錯,不敢獨享,於是翻譯成中文供