我试图理解本文关于 LSH 的第 5 节,特别是如何存储生成的哈希。引用链接的论文:
给定每个由 d 位组成的位向量,我们选择 N = O(n 1/(1+epsilon) ) 位的随机排列。对于每个随机排列 σ,我们维护位向量的排序顺序 O σ,按照由 σ 排列的位的字典顺序。给定一个查询位向量 q,我们通过执行以下操作找到近似最近邻: 对于每个排列 σ,我们对 O σ 执行二进制搜索,以定位最接近 q 的两个位向量(按获得的字典顺序)由 σ 置换的位)。我们现在按照与 q 匹配的最长前缀的长度的顺序在每个排序顺序 O σ 中搜索由二分搜索返回的位置上方和下方的元素。这可以通过为每个排序顺序 O σ 维护两个指针来完成(一个向上移动,另一个向下移动)。在每一步中,我们向上或向下移动与具有最长匹配前缀的元素相对应的指针之一。(这里 O σ 中最长匹配前缀的长度是相对于 q 计算的,其位由 σ 置换)。我们以这种方式检查 2N = O(n 1/(1+epsilon) ) 位向量。在检查的所有位向量中,我们将具有最小汉明距离的位向量返回到 q。
我对这个算法感到困惑,我认为我不明白它是如何工作的。
我已经在该主题上找到了这个问题,但我不明白评论中的答案。同样在第 2 点的这个问题中,描述了相同的算法,但同样,我不明白它是如何工作的。
你能试着向我解释它是如何工作的,并尽可能地简单吗?
我什至试着把我看不懂的东西列个清单,但实际上写得太糟糕了,我看不懂大部分句子!
在 gsamaras 回答后编辑:
我基本上明白了答案,但我仍然有一些疑问:
是否正确地说执行
N
排列的总成本是O(Nnlogn)
,因为我们必须对它们中的每一个进行排序?上述排列+排序过程在预处理期间或每个查询中只执行一次
q
?O(Nnlogn)
即使在预处理中,它似乎已经相当昂贵,如果我们必须在查询时这样做,那将是一场灾难:D在最后一点,我们比较
v0
和v4
,q
我们比较它们的置换版本还是原始版本(在它们置换之前)?