1. 程式人生 > >java實現編輯距離演算法,計算字串相似度

java實現編輯距離演算法,計算字串相似度

 

這是Levenshtein Distance演算法的java實現,另外oracle 10g r2當中好像自帶了這樣的函式,utl_match包當中

public class LD {

  /** 
     * 計算向量距離 
     * Levenshtein Distance(LD)  
     * @param str1 str1 
     * @param str2 str2 
     * @return ld 
     */ 
    public int ld(String str1, String str2)  
    {  
        //Distance  
        int [][] d;   
        int n = str1.length();  
        int m = str2.length();  
        int i; //iterate str1  
        int j; //iterate str2  
        char ch1; //str1   
        char ch2; //str2    
        int temp;      
        if (n == 0)  
        {  
            return m;  
        }  
        if (m == 0)  
        {  
            return n;  
        }  
        d = new int[n + 1][m + 1];  
        for (i = 0; i <= n; i++)  
        {   d[i][0] = i;  
        }  
        for (j = 0; j <= m; j++)  
        {   
            d[0][j] = j;  
        }  
        for (i = 1; i <= n; i++)  
        {     
            ch1 = str1.charAt(i - 1);  
            //match str2     
            for (j = 1; j <= m; j++)  
            {  
                ch2 = str2.charAt(j - 1);  
                if (ch1 == ch2)  
                {  
                    temp = 0;  
                }  
                else 
                {  
                    temp = 1;  
                }  
   
                d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);  
            }  
        }  
        return d[n][m];  
    }  
   
    private int min(int one, int two, int three)  
    {  
        int min = one;  
        if (two < min)  
        {  
            min = two;  
        }  
        if (three < min)  
        {  
            min = three;  
        }  
        return min;  
    }  
   
    /** 
     * 計算相似度 
     * @param str1 str1 
     * @param str2 str2 
     * @return sim   
     */ 
    public double sim(String str1, String str2)  
    {  
        int ld = ld(str1, str2);  
        return 1 - (double) ld / Math.max(str1.length(), str2.length());  
    }  
      
    /** 
     * 測試 
     * @param args 
     */ 
    public static void main(String[] args)  
    {  
        LD ld = new LD();  
        double num = ld.ld("人民", "中國人民是人才");  
        System.out.println(num);  
    }
}

相關推薦

java實現編輯距離演算法計算字串相似

 這是Levenshtein Distance演算法的java實現,另外oracle 10g r2當中好像自帶了這樣的函式,utl_match包當中public class LD {  /**       * 計算向量距離       * Levenshtein Distan

編輯距離 演算法詳述計算兩個字串差異 c++程式碼

編輯距離即從一個字串變換到另一個字串所需要的最少變化操作步驟(以字元為單位,如son到sun,s不用變,將o->s,n不用變,故操作步驟為1)。 為了得到編輯距離,我們畫一張二維表來理解,以beauty和batyu為例: 圖示如1單元格位置即是兩個單詞的第一個字元[b]比較得到的值,其值由它上方的

java實現二分查詢演算法兩種方式實現非遞迴和遞迴

java實現二分查詢演算法 1、概念 2、前提 3、思想 4、過程 4、複雜度 5、實現方式 1. 非遞迴方式 2. 遞迴方式

Java程式碼實現餘弦相似演算法比較兩字串相似

因工作需要比較兩個兩個字串的相似度比較,由於最短編輯距離演算法不符合需求,就又找其他演算法,在網上看到了另一個演算法:餘弦相似度演算法。於是學習了一下,並寫篇部落格儲存,以便學習以及日後用到。 程式碼如下: import java.util.HashMap im

java實現K-means演算法k-means聚類演算法原理

/** * 需要所有point 以及族中心list * * @author:Yien * @when:2018年5月20日下午3:14:09 * @Description:TOD

LeetCode之計算字串相似編輯距離EditDistance

問題描述: /** * Given two words word1 and word2, find the minimum number of steps required to * convert word1 to word2. (each oper

c++實現aes加密演算法字串進行加密

我的blog中,已經寫過一篇關於aes加密演算法的呼叫。不過使用的引數必須時unsigned char型別。我們在 程式設計中使用最多的char型別,我從網上下載了一個程式碼,追加了一部分程式碼。     其主要功能進行實現unsigned char型別資料到char

計算字串相似的一些方法

產品出了一個奇怪的需求,想通過字串相似度取匹配城市= =(當然,最後證實通過字串相似度取判斷兩個字串是不是一個城市是不對的!!!) 這裡就記錄一下我計算字串(英文字串)相似度的方法吧~ 參考文件: L

計算字串相似

問題描述:有兩個不同的字串,通過使用一套操作方法可以把兩個字串變成一樣的。 例如: 1)  "a" 和 "b"  ==>  把a變成b,或把b變成a  變化了一次 2)  "abc" 和 "ade"  ==>  把bc變成de,或把de變成bc  變化了兩次

編輯距離演算法Java實現

/** * 計算編輯距離Edit Distance * if i == 0 且 j == 0,edit(i, j) = 0 * if i == 0 且 j > 0,edit(i, j) = j * if i > 0 且j == 0,edit(i,

字串相似演算法編輯距離演算法 Levenshtein Distance)

在搞驗證碼識別的時候需要比較字元程式碼的相似度用到“編輯距離演算法”,關於原理和C#實現做個記錄。 據百度百科介紹: 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可

用隨機數實現插入排序演算法計算程式執行時間

插入排序 插入排序演算法是一種就地演算法(空間用量是一個常數) 我們希望排序的數也稱為關鍵詞(key),也就是說對一系列 key 進行排序。 輸入是以一個陣列表示的。 相對於歸併排序來說,該演算法對小規模資料的效率比較高。 插入排序演算法思想: 每

java實現各種排序演算法(包括氣泡排序選擇排序插入排序快速排序(簡潔版))及效能測試

1、氣泡排序是排序裡面最簡單的了,但效能也最差,數量小的時候還可以,數量一多,是非常慢的。      它的時間複雜度是O(n*n),空間複雜度是O(1)      程式碼如下,很好理解。 public static void bubbleSort(int[] arr)

演算法介紹(3) 編輯距離演算法-字串相似

           編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。        具體的操作方法為:     

java的BitSet實現位排序演算法複雜為O(n)

今天小樹用Java語言寫了個位排序演算法,演算法複雜度為O(n). import java.util.*; public class BitSort { public static vo

對於一個字串請設計一個高效演算法計算其中最長迴文子串的長度。

給定字串A以及它的長度n,請返回最長迴文子串的長度。  測試樣例: "abc1234321ab",12  返回:7 分析與解法 最容易想到的辦法是列舉所有的子串,分別判斷其是否為迴文。這個思路初看起來是正確的,但卻做了很多無用功,如果一個長的子串包含另一個短一些的子

Java實現base64圖片轉換為base64字串。base64字串轉換圖片 之間的互相轉換並儲存在本地。

java實現Base64資料圖片和資料間的互相轉換 首先建立類。寫兩個方法: 圖片轉base64字串方法:GetImageStr(); 字串轉為圖片方法:GenerateImage(); pa

編輯距離演算法實現

        編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個

最短編輯距離演算法字串比較)

一、編輯距離 1、從字串a變為字串b所需要的元操作有3種: 增加一個字元刪除一個字元變化一個字元2、編輯距離:從字串a變為b所需要的最少操作步驟。 二、最短編輯距離(動態規劃) 首先定義一個函式——s

JAVA-從題目看演算法將輸入字串進行排序並輸出

來看一個排列的例子,它所做的工作是將輸入的一個字串中的所有元素進行排序並輸出,例如:你給出的引數是"abc" 則程式會輸出:abc acb bac bca cab cba 這是一個典型的可用遞迴演算法來實現的例子,我們來看一下利用遞迴的2種不同解法。 1.典型遞迴元素交換