例: 如果我有字符串“asdf”和字符串集(“qwer”,“aswr”,“asdv”)。集合和字符串之间的汉明距离为1,因为“asdv”和“asdf”具有汉明距离1。
使用类似的东西很容易暴力
def hamming_distance(string, set):
min = len(string)
for element in set:
element_distance = sum(ch1 != ch2 for ch1, ch2 in zip(string, element))
if min > element_distance:
min = element_distance
if min == 0:
break
return min
我认为这有O(n * k),其中n = len(字符串),k = len(set)。但是,最大集合大小与n ^ 2成比例,这意味着我们基本上处理O(n ^ 3)。这些集相当静态,所以如果预处理有帮助那肯定是一个选择。
最后,我应该提一下,这里的应用程序是确定哪个集合最接近相关字符串,但我已经减少了问题,因为字符串长度是一个比集合数量更多的限制因素。如果有另一种方法来通过查看整个空间而不是单个子集来实现这一点,那么我将全部听到。当我第一次采用这种方法时,似乎空间复杂性会变得非常荒谬。
答案 0 :(得分:1)
首先,字符串之间的汉明距离是公制。因此,您试图在度量空间中找到k-最近邻居(其中k = 1)。
因此,您可能需要考虑类似于M-Tree数据结构的树:(请参阅http://en.wikipedia.org/wiki/M-tree和http://www.vldb.org/conf/1997/P426.PDF)。此树旨在减少为查找“最近邻居”而需要执行的距离比较。
就我个人而言,我无法在网上找到我满意的M-Tree实现(请参阅我的封闭线程寻找成熟的M-Tree实现),所以我自己动手了。
我的实施在这里:https://github.com/jon1van/MTreeMapRepo
我唯一能找到的其他实现就是这个:https://github.com/erdavila/M-Tree我不喜欢这个实现,因为它没有删除功能(以及其他几个问题)(但它是免费的,所以......这很好)。
您可能需要考虑使用我的代码(它在通用度量标准空间中解决kNN搜索)与Levensthtein距离度量(http://en.wikipedia.org/wiki/Levenshtein_distance)。在线查找完全实施的Levenshtein距离指标应该非常简单
添加Levenstein距离函数** http://code.google.com/p/google-refine/source/browse/trunk/src/main/java/edu/mit/simile/vicino/distances/LevensteinDistance.java?r=181