这不是我紧急需要的问题,更是一个挑战性的问题,所以不要整日花在那些家伙上。
我在2000年左右建立了一个约会网站(早已消失),其中一项挑战是计算用户之间的距离,以便我们可以在X英里半径内显示您的“匹配项”。仅给出以下数据库架构,仅说明问题:
用户表UserId用户名ZipCode
邮政编码表邮政编码纬度经度
将USER和ZIPCODE连接到USER.ZipCode = ZIPCODE.ZipCode。
您将采用哪种方法来回答以下问题:在距给定用户的邮政编码X英里以内的邮政编码中居住着哪些其他用户。
我们使用了2000年的人口普查数据,其中包含邮政编码表以及它们的近似纬度和经度。
我们还使用Haversine公式来计算球体上任意两个点之间的距离。
至少对我们来说,问题是,我们还是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表中将包含很多行。这不是完全不可行的,但确实很大。另外,它还需要对整个数据集进行完整的准备工作,这也不是无法管理的,但不一定是令人满意的。
无论如何,我想知道你们中的某些大师会采取什么样的方法。另外,我认为这是程序员经常要解决的常见问题,尤其是当您考虑算法上相似的问题时。我对一个彻底的解决方案感兴趣,该解决方案在所有方面都至少包含提示,以确保快速有效地完成此任务。谢谢!
哈士奇WWW
相关分类