设计思路:
(1)我们首先需要提出一个指标来衡量单词的相似程度,利用编辑距离,即字符串A经过插入,删除,改变三个操作变成字符串B需要花费的最少操作次数,利用动态规划即可解决.
(2)如何高效找出候选单词呢,建立字典树然后遍历比较是可以的,但是在单词数量大的时候效率很低。利用BK树可以避免大量的不必要比较,简单来说,A->B+B->C的距离一定大于等于A->C的距离,它满足三角不等式,由此可以推导出两边之和小于第三边的公式。假设我们希望A与B的距离小于N1,那么对于任意C,不妨假设AC距离是d,CB距离是X,有如下结论:
D+N=>D+Distance(A,B)>=x
X+Distance(A,B)>=d => X>= d-Distance(A,b) >= d – N
X+d>=Distance(A,B) = > x>=N-d
所以X一定位于(|d-n|,d+n)之间。一般来说,n相对比较小,不妨假设是2,那么x至多有5种可能,如果我们将每一个单词看作节点,每个距离看作边,显然可以构造一棵树,然后从当前节点出发只有5条边可以走,不妨假设5条边占全部数据的0.6,树有5层,那么需要比较的数据量就变成了0.6**5 = %7.7左右,极大的减少了不必要的比较。