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。