匹配数百万人:k-d 树或局部敏感散列?

Matching millions of people: k-d tree or locality-sensitive hashing?

我正在寻找一种高性能算法来匹配大量按位置性别年龄的人 根据这个数据结构:

对于任何人 P,算法应该 return 候选人 C 适用于:

算法应该 return 前 100 个候选 C 按距离排序 (Lat/Long)。该算法应该针对搜索和更新进行优化,因为人们可能经常更改他们的位置。

我目前的想法是 k-d 树 可能比 locality-sensitive-hashing 更适合这些需求,我应该去到这个方向。

你对我有什么建议?我应该寻找什么?您认为有哪些风险?

谢谢!

更新:

Here 是 Microsoft 如何使用其空间索引的一些信息('spatial' 是您要搜索的关键字)。

您要查找的查询是 k=100 的 k 最近邻查询(kNN 搜索)。

如果你想自己序列化索引,看看R+tree or R*trees, they are quite good for page based serialization. There are lots of open source example for these trees. Here是我自己在Java中的实现,不幸的是它不支持序列化。

关于其他索引:

  • 我对LHS没有经验,所以不能多说。不过我知道一件事,因为它在内部是一个 HashMap,所以您需要特别注意使其可扩展到大量数据。这无疑增加了复杂性。另一个问题,我不确定 LSH 是否适用于 kNN 搜索,你必须查一下。
  • KD 树非常简单,应该适合工作,但不利于序列化,并且会产生大量内存开销,除非您实现的版本可以在每个节点中包含多个条目。 KD 树在经常更新时也会退化,因此它们可能需要重新平衡。
  • 否则我建议使用四叉树,例如qthypercube2。它们也非常简单,内存非常快,非常适合频繁更新,尤其是当条目只移动一小段距离时。