我正在尝试理解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回答后编辑:
我大多理解答案,但我仍然有些疑惑:
执行N
排列的总费用是O(Nnlogn)
是否正确,因为我们必须对其中的每一个进行排序?
上述排列+排序过程在预处理过程中只执行一次,或每个查询q
?即使在预处理中,它似乎已经相当昂贵O(Nnlogn)
,如果我们必须在查询时执行此操作,那将是一场灾难:D
在最后一点,我们将v0
和v4
与q
进行比较,我们比较了他们的置换版本或原始版本(在置换之前)?
答案 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 强>
在最后一点,我们将
v0
和v4
与q
进行比较,我们比较他们的置换版本或原始版本(在置换之前)?
我认为他们使用置换版本执行此操作(请参阅论文中2N
之前的括号)。但这没有任何区别,因为他们也使用相同的置换(q
)来置换σ
。
这quora answer也可能会有所启发。