http://www.cnblogs.com/tianchi/archive/2013/02/25/2886964.htmlhtml
http://my.oschina.net/BreathL/blog/42477web
計算公式爲:算法
P(A,B) = sqrt(A × B) / (|A| × |B|)spa
設有兩個字符串:.net
ABCDEFGorm
ABCHIJKhtm
其中共有11個字符,爲:blog
A B C D E F G H I J K字符串
若是,不考慮他們之間的關聯性以及順序等隱私,那麼能夠講這兩個字符串轉換成兩個11維空間中的向量:get
{一、一、一、一、一、一、一、0、0、0、0}
{一、一、一、0、0、0、0、一、一、一、1}
那,計算他們之間的類似度爲:
P = sqrt(3) / (sqrt(7) × sqrt(7)) = 0.2474358297
給定兩個長度相等的字符串,在移動的過程當中比較:
a | b | c | d | d | a | c | b | c | b | ||
a | a | d | a | c | c | b | d | d | c |
首先有幾個變量:
n:字符串的長度,此時爲10;
m:相同的字符,此時爲3,包括d、a、c;
r:兩個字符串重疊部分,此時爲8;
那麼給出定義:
重疊率:L = r / n。
匹配率:M = m / n。
類似度:Q = M^2 × L = (m^2 / n^2) × (r / n)。
其實爲何這樣定義也很好理解,將Q變形一下就能夠獲得:
Q = (m^2 / r^2) × (r / n)
前半部分表示了當前相同的比率,後半部分表示了重疊的比率,而後呢,廢話就很少說了。其實,還有一個要考慮的地方,舉個例子:
str1:abcabc
str2:abcdabc
str1和str2的類似度是很高的,可是,在移位錯開的過程當中根本沒辦法找到這種匹配。想一想其實緣由也是很是簡單的:把全部的字符都死板地粘合在了一塊兒!那麼,咱們要作的其實就是將他們打散來匹配。首先,根據字符串A和字符串B來構造矩陣R:
Ai和Bi+j相同時,Rij = 1;不然,Rij = 0。
那麼,如今要作的事情就是,在矩陣R中尋找一條路徑,使得這條路徑上的1最多,這個問題和求兩個字符串的最大匹配很像的DP問題,這裏就不囉嗦了。
還有一種衡量兩個字符串之間的差別性的方法是,計算兩個字符串轉換時候須要的最少操做,須要的操做越少說明這兩個字符串越類似。
假設字符串的操做只有三種:
插入一個字符;
刪除一個字符;
替換一個字符;
兩個字符串之間的編輯距離定義爲:從字符串str1到str2的最少的操做次數。首先,編輯距離是不會大於str1.length + str2.length的。假設求字符A、B的編輯距離,考慮下面幾種狀況:
若是A[i] = B[j],那麼這時候還須要操做嗎?
這個時候的刪除和替換操做只會讓狀況變得更壞,並且插入操做不會使狀況變得更好,因此此時F(i, j) = F(i-1, j-1)。
若是A[i] != B[j],怎麼辦呢?
a、從F(i-1, j-1)變過來,這時候只須要把A[i]替換爲B[j]便可;
b、從F(i-1, j)變過來,這時候只須要將A[i]刪除便可;
c、從F(i, j-1)變過來,這時候只須要在A[i]後插入字符B[j]便可;
那麼此時,F(i, j) = min{F(i-1,j-1),F(i-1,j),F(i,j-1)} + 1。
注:其中F(i, j)表示A[0..i]和B[0..j]之間的編輯距離。看完這種類似度想起了BFS的入門題目:《聰明的打字員》,囧。
------------
END。