采用编辑距离来度量两个字符串之间的相似程度。对于单个字符定义三种操作,插入、删除、修改,最一个字符串经过最少的操作变为另一个字符串,这个操作的次数即为这两个字符串的编辑距离(Levenshtein距离)。具体计算方法见:http://www.cnblogs.com/datakv/p/5630640.html
通过编辑距离构造构造一个度量空间(Metric Space),该空间内任何关系满足以下三条基本条件:
d(x,y) = 0 <-> x = y (假如x与y的距离为0,则x=y)
d(x,y) = d(y,x) (x到y的距离等同于y到x的距离)
d(x,y) + d(y,z) >= d(x,z)
先在字符串集合中任选一个字符串Z作为根节点,然后每次从集合中取出一个字符串X,将其插入树中。插入规则是这样的,首先计算X与根节点Z的编辑距离L(X,Z),然后将这个节点插入到Z的编号为L(X,Z)的孩子那边;递归直到到达X可以成为叶子节点。
查找字符串A编辑距离为d以内的相似字符串,那么从根节点开始寻找,先计算L(Z,A),这个时候我们就知道了与A编辑距离为d的字符串只可能存在于Z的编号为L(Z,A)-d到编号为L(Z,A)+d之间的那些子树里面,执行递归查找就行。
实践表明,一次查询所遍历的节点不会超过所有节点的5%到8%,两次查询则一般不会17-25%,效率远远超过暴力枚举。适当进行缓存,减小Levenshtein距离常数n可以使算法效率更高。