计算单词列表中的反汉明距离

时间:2015-12-03 21:36:38

标签: algorithm hamming-distance

我希望在单词列表的每个单词中找到相同位置的相同字符的数量。因此,例如,最终结果将是与列表中的其他单词相比较的单词矩阵,其显示两者之间的反汉明距离,如:Inverse Hamming Distance Matrix

鉴于hamm_dist(a,b) = hamm_dist(b,a)我只需要在对角线的右侧进行计算。是否有更有效的方法来查找这些值,而不仅仅是一堆调用来计算任何两个之间的距离?

1 个答案:

答案 0 :(得分:1)

如果我们在谈论填充这样一个矩阵的复杂性,显然你不能比O(n^2)更好,其中n是单词的数量。至少不是在最糟糕的情况下。

但是,这是另一种解决方案,与您建议的解决方案相比,需要更少的char-to-char比较。

为每个单词指定一个索引,从而创建(<index>, <word>)形式的元组。同样,L为输入中单词的最大长度,M为输出矩阵。

set all elements in M to 0
for i = 1 to L do
    sort the tuples using the ith character of the words as key
    for every pair w1 w2 of words having the same ith letter do
        M[w1,w2]++
    endfor
endfor

换句话说,对于每个索引位置,使用该位置上的字符作为键对单词进行排序,并增加该位置上具有相同值的所有单词对的计数器。由于我假设您的字母表不是很宽,您可以使用计数排序。实际上,您并不需要排序,而是将每个单词(实际上是您已分配给该单词的索引)放在相应的存储桶中(字母表中每个可能的字母都有一个存储桶)。

复杂性明智,此解决方案需要O(L*n) char-to-char&#34;比较&#34;和O(S)逐一增加的操作,其中S是所有汉明距离的总和。您的解决方案似乎采用O(L*n^2) char-to-char比较和O(S)逐个操作。我的比较&#34;不是实际的比较,而只是对单词中第i个位置的询问。