我正在寻找一种高效的算法,根据以下数据结构,通过“位置”、“性别”和“年龄”来匹配大量人员:
- 经度(表示个人位置) - 纬度(表示个人位置) - 性别(表示个人性别) - 出生日期(表示个人出生日期) - 寻找的性别(表示个人寻找的性别) - 寻找的最小年龄(表示个人寻找的最小年龄) - 寻找的最大年龄(表示个人寻找的最大年龄) - 寻找的半径(表示个人寻找的最大距离) - 已处理(表示此人已处理的其他人)
对于任何人P,该算法应返回符合以下条件的候选人C:
- C的性别必须等于P的LookingForGender - P的性别必须等于C的LookingForGender - C的出生日期必须在P的LookingForMinAge和LookingForMaxAge之间 - P的出生日期必须在C的LookingForMinAge和LookingForMaxAge之间 - P和C之间的纬度/经度距离必须小于或等于P的LookingForRadius - P和C之间的纬度/经度距离必须小于或等于C的LookingForRadius - P的Processed中不得包含C
该算法应按距离(纬度/经度)的顺序返回前100个候选人C。该算法应针对搜索和更新进行优化,因为人们可能经常更改位置。
我目前的想法是,k-d树可能比局部敏感哈希更适合这些需求,因此我应该朝这个方向发展。
您对我有什么建议?我该寻找什么?您看到了哪些风险?
谢谢!
更新:
- 经度(表示个人位置) - 纬度(表示个人位置) - 性别(表示个人性别) - 出生日期(表示个人出生日期) - 寻找的性别(表示个人寻找的性别) - 寻找的最小年龄(表示个人寻找的最小年龄) - 寻找的最大年龄(表示个人寻找的最大年龄) - 寻找的半径(表示个人寻找的最大距离) - 已处理(表示此人已处理的其他人)
对于任何人P,该算法应返回符合以下条件的候选人C:
- C的性别必须等于P的LookingForGender - P的性别必须等于C的LookingForGender - C的出生日期必须在P的LookingForMinAge和LookingForMaxAge之间 - P的出生日期必须在C的LookingForMinAge和LookingForMaxAge之间 - P和C之间的纬度/经度距离必须小于或等于P的LookingForRadius - P和C之间的纬度/经度距离必须小于或等于C的LookingForRadius - P的Processed中不得包含C
该算法应按距离(纬度/经度)的顺序返回前100个候选人C。该算法应针对搜索和更新进行优化,因为人们可能经常更改位置。
我目前的想法是,k-d树可能比局部敏感哈希更适合这些需求,因此我应该朝这个方向发展。
您对我有什么建议?我该寻找什么?您看到了哪些风险?
谢谢!
更新:
- 我是否愿意为更好的时间复杂度而牺牲空间复杂度?是的,我愿意为更好的时间复杂度而牺牲空间复杂度。但是,我更喜欢一个 O(log n) 的解决方案,它让我可以理解和维护,而不是一个我无法理解的 O(1) 解决方案 :)
- 数据是否适合放入主存储器中?不适合。数据将分布在分布式文档数据库(Azure Cosmos DB SQL API)的不同节点上。
- 你想要精确的结果还是近似的结果?近似的结果可以接受,但应该精确筛选出年龄/性别。
- 添加了“已处理”到算法中,之前漏掉了!
- 人们多久会更改他们的位置?用户每次打开应用程序并寻找候选人时都会更改其位置。因此,每天活跃用户将一天内更改自己的位置一次或多次。然而,位置变化可能只是一些公里。从100个应用程序下载中,有15个用户将在一个月内使用该应用程序一次或多次,3个用户将每天使用一次或多次。