搜索位置敏感哈希

时间:2016-05-22 16:52:34

标签: algorithm computational-geometry nearest-neighbor locality-sensitive-hash approximate-nn-searching

我正在尝试理解this paper关于LSH的第5节,特别是如何打包生成的哈希值。引用链接的论文:

  

给定由d位组成的位向量,我们选择N = O(n 1 /(1 + epsilon)   )比特的随机排列。对于每个随机排列σ,我们   按字典顺序维持位向量的排序顺序Oσ   由σ排列的比特数。给定一个查询位向量q,我们找到了   通过执行以下操作近似最近邻居:对于每个permu-   tationσ,我们在Oσ上执行二进制搜索以找到两位   最接近q的向量(按字节顺序获得的字典顺序)   σ)置换。我们现在搜索每个排序的订单Oσ   检查二进制返回的位置上方和下方的元素   按照与q匹配的最长前缀的长度顺序搜索。   这可以通过为每个排序顺序Oσ维护两个指针来完成   (一个向上移动而另一个向下移动)。在每一步我们移动其中一个   对应于具有最长的元素的向上或向下的指针   匹配前缀。 (这里是O中最长匹配前缀的长度   σ是相对于q计算的,其位由σ)置换。我们检查   以这种方式2N = O(n 1 /(1 + epsilon))位运算符。在所有位向量中   检查,我们返回具有最小汉明距离的那个   Q值。

我对这个算法很困惑,我不认为我理解它是如何工作的。

我在这个主题上找到了this question,但我在评论中没有理解答案。同样在第2点的this问题中,描述了相同的算法,但同样,我不明白它是如何工作的。

请您尝试向我解释一下它是如何逐步尝试更简单的?

我甚至试图列出一些我不理解的东西,但在实践中写的很糟糕,我不理解大多数句子!

在gsamaras回答后编辑:

我大多理解答案,但我仍然有些疑惑:

  1. 执行N排列的总费用是O(Nnlogn)是否正确,因为我们必须对其中的每一个进行排序?

  2. 上述排列+排序过程在预处理过程中只执行一次,或每个查询q?即使在预处理中,它似乎已经相当昂贵O(Nnlogn),如果我们必须在查询时执行此操作,那将是一场灾难:D

  3. 在最后一点,我们将v0v4q进行比较,我们比较了他们的置换版本或原始版本(在置换之前)?

1 个答案:

答案 0 :(得分:3)

这个问题有点宽泛,所以我只想在这里给出一个最小的(抽象)例子:

我们的数据集中有6个(= n)个向量,每个向量都有d个位。假设我们做2(= N)随机排列。

让第一个随机排列开始!请记住,我们置换不是向量的顺序。在置换位之后,它们维持一个顺序,例如:

v1
v5
v0
v3
v2
v4

现在查询向量q到了,但是(几乎)不太可能与我们的数据集中的向量相同(在置换之后),因此我们通过二进制搜索找不到它。

然而,我们将在两个向量之间结束。所以现在我们可以想象场景就像这样(例如q位于v0和v3之间:

v1
v5
v0 <-- up pointer
   <-- q lies here
v3 <-- down pointer
v2
v4

现在我们向上或向下移动指针,寻找与q最多匹配的vi向量。我们说这是v0。

类似地,我们进行第二次排列,我们找到向量vi,比如说v4。我们现在比较第一个排列和v4的v0,看看哪一个最接近q,即哪个位数最多等于q

修改

  

表示执行N个排列的总成本是O(Nnlogn)是否正确,因为我们必须对它们中的每一个进行排序?

如果他们实际上从头开始排序每个排列,那么,但我不清楚他们是如何做到的。

  

上述排列+排序过程在预处理过程中只执行一次或每次查询q

<强> ONCE

  

在最后一点,我们将v0v4q进行比较,我们比较他们的置换版本或原始版本(在置换之前)?

认为他们使用置换版本执行此操作(请参阅论文中2N之前的括号)。但这没有任何区别,因为他们也使用相同的置换(q)来置换σ

quora answer也可能会有所启发。