This is more of a challenge question than something I urgently need, so don't spend all day on it guys.个
我早在2000年左右就建立了一个约会网站(早已不复存在),其中一个挑战是计算用户之间的距离,这样我们就可以在X英里的半径内展示你的"匹配".为了说明问题,给出以下数据库模式(大致):
用户表
邮政编码表格 邮政编码 纬度 经度
在USER.ZipCode=ZIPCODE.ZipCode上连接用户和邮政编码.
你会采取什么方法来回答以下问题:哪些用户居住在距离给定用户的邮政编码X英里范围内的邮政编码中.
我们使用了2000 census data,其中有邮政编码表及其大致的纬度和经度.
我们还使用Haversine Formula来计算球体上任意两点之间的距离...非常简单的数学.
问题是,至少对我们来说,作为19岁的大学生,我们真的变成了如何有效地计算和/存储所有成员到所有其他成员的距离.一种方法(我们使用的方法)是导入所有数据并计算从每个邮政编码到每个其他邮政编码的距离.然后,您将存储结果并对其进行索引.类似于:
SELECT User.UserId
FROM ZipCode AS MyZipCode
INNER JOIN ZipDistance ON MyZipCode.ZipCode = ZipDistance.MyZipCode
INNER JOIN ZipCode AS TheirZipCode ON ZipDistance.OtherZipCode = TheirZipCode.ZipCode
INNER JOIN User AS User ON TheirZipCode.ZipCode = User.ZipCode
WHERE ( MyZipCode.ZipCode = 75044 )
AND ( ZipDistance.Distance < 50 )
当然,问题是ZipDistance表中将有很多行.这并不是完全行不通的,但它真的很大.此外,它还需要对整个数据集进行完整的前期工作,这也不是无法管理的,但不一定是可取的.
不管怎样,我想知道你们中的一些大师会对这样的事情采取什么态度.另外,我认为这是程序员使用撞击时经常遇到的问题,特别是当你考虑算法上相似的问题时.我感兴趣的是一个彻底的解决方案,它至少包括所有部分的提示,以便真正快速、高效地完成这项工作.谢谢!