如何在n维空间中找到k-最近值?

时间:2010-03-06 13:49:17

标签: computational-geometry multivariate-partition minhash hamming-distance

我读到了关于kd-trees但是当空间的维数很高时它们效率低下。我有一个有价值的数据库,我想找到查询的某个汉明距离内的值。例如,数据库是32位数字的列表,我想找到与查询值不同的所有数字少于3位。

我听说过有关MultiVariate Partition树的地方,但找不到好的参考。我知道min-Hash给出了一个很好的近似值,但是我想得到一个确切的答案。

1 个答案:

答案 0 :(得分:1)

汉明距离与levenshtein distance密切相关,与用于拼写校正的算法类似。

有效的方法是branch-and-boundtrie中进行搜索。对于近距离,需要时间以指数形式表示距离,直到字典大小为线性。

如果字典是二进制字存储在二进制字符串中,具有严格的汉明距离,这里有一个简单的伪代码:

walk(trie, word, i, hit, budget){
  if (budget < 0 || i > word.length) return;
  if (trie==NULL){
    if (i==word.length) print hit;
    return;
  }
  hit[i] = 0;
  walk(trie.subtrie[0], word, i+1, hit, (word[i]==0 ? budget : budget-1));
  hit[i] = 1;
  walk(trie.subtrie[1], word, i+1, hit, (word[i]==1 ? budget : budget-1));
}

main(){
  for (int budget = 0; ; budget++){
    walk(trie, word, 0, hit, budget);
    /* quit if enough hits have been printed */
  }
}

这个想法是你走完整个特里,跟踪当前特里节点和原始字之间的距离。您可以通过预算可以容忍的距离来修剪搜索。这是有效的,因为当你深入到特里时,距离永远不会减少。

然后重复执行此操作,预算从零开始并逐步增加,直到您打印出所需的匹配。由于每次行走所覆盖的节点比后续行走的节点少得多,因此您不必多次行走。如果k已修复,您只需将其作为预算开始。