qq_笑_17
2019-12-25 15:07:02
這不是我緊急需要的問(wèn)題,更是一個(gè)挑戰(zhàn)性的問(wèn)題,所以不要整日花在那些家伙上。我在2000年左右建立了一個(gè)約會(huì)網(wǎng)站(早已消失),其中一項(xiàng)挑戰(zhàn)是計(jì)算用戶(hù)之間的距離,以便我們可以在X英里半徑內(nèi)顯示您的“匹配項(xiàng)”。僅給出以下數(shù)據(jù)庫(kù)架構(gòu),僅說(shuō)明問(wèn)題:用戶(hù)表UserId用戶(hù)名ZipCode郵政編碼表郵政編碼緯度經(jīng)度將USER和ZIPCODE連接到USER.ZipCode = ZIPCODE.ZipCode。您將采用哪種方法來(lái)回答以下問(wèn)題:在距給定用戶(hù)的郵政編碼X英里以?xún)?nèi)的郵政編碼中居住著哪些其他用戶(hù)。我們使用了2000年的人口普查數(shù)據(jù),其中包含郵政編碼表以及它們的近似緯度和經(jīng)度。我們還使用Haversine公式來(lái)計(jì)算球體上任意兩個(gè)點(diǎn)之間的距離。至少對(duì)我們來(lái)說(shuō),問(wèn)題是,我們還是19歲的大學(xué)生,實(shí)際上成為了如何有效地計(jì)算和/存儲(chǔ)所有成員到所有其他成員的距離的問(wèn)題。一種方法(我們使用的一種方法)是導(dǎo)入所有數(shù)據(jù)并計(jì)算從每個(gè)郵政編碼到每個(gè)其他郵政編碼的距離。然后,您將存儲(chǔ)結(jié)果并為其編制索引。就像是:SELECT User.UserIdFROM 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.ZipCodeWHERE ( MyZipCode.ZipCode = 75044 ) AND ( ZipDistance.Distance < 50 )當(dāng)然,問(wèn)題在于ZipDistance表中將包含很多行。這不是完全不可行的,但確實(shí)很大。另外,它還需要對(duì)整個(gè)數(shù)據(jù)集進(jìn)行完整的準(zhǔn)備工作,這也不是無(wú)法管理的,但不一定是令人滿(mǎn)意的。無(wú)論如何,我想知道你們中的某些大師會(huì)采取什么樣的方法。另外,我認(rèn)為這是程序員經(jīng)常要解決的常見(jiàn)問(wèn)題,尤其是當(dāng)您考慮算法上相似的問(wèn)題時(shí)。我對(duì)一個(gè)徹底的解決方案感興趣,該解決方案在所有方面都至少包含提示,以確保快速有效地完成此任務(wù)。謝謝!
3 回答

哈士奇WWW
TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以將空間劃分成大小大致相等的區(qū)域-例如,將地球近似為布基球或二十面體。如果更容易的話(huà),這些區(qū)域甚至可以重疊一點(diǎn)(例如,使其成為圓形)。記錄每個(gè)郵政編碼所在的區(qū)域。然后,您可以預(yù)先計(jì)算每個(gè)區(qū)域?qū)χg的最大距離,該區(qū)域與計(jì)算所有郵政編碼對(duì)具有相同的O(n ^ 2)問(wèn)題,但n較小。
現(xiàn)在,對(duì)于任何給定的郵政編碼,您都可以獲得絕對(duì)在給定范圍內(nèi)的區(qū)域列表以及跨邊界的區(qū)域列表。對(duì)于前者,只需獲取所有郵政編碼。對(duì)于后者,請(qǐng)深入每個(gè)邊界區(qū)域并針對(duì)各個(gè)郵政編碼進(jìn)行計(jì)算。
這肯定在數(shù)學(xué)上更加復(fù)雜,尤其是必須選擇區(qū)域的數(shù)量以在表的大小和動(dòng)態(tài)計(jì)算所花費(fèi)的時(shí)間之間取得良好的平衡,但是它可以將預(yù)先計(jì)算的表的大小減小余量。
添加回答
舉報(bào)
0/150
提交
取消