2017-04-11 84 views
2

我有一個列表A的座標(十進制,十進制)和〜10.000點,第二個列表B的相同類型的座標約100萬點。從另一個點有效地找到最近點

我想找到列表用於名單B.每個元素的最近點

我已經做的是創建兩個列表的笛卡兒積,並使用半正矢找到所有組合的距離式。

然後我得到的名單A具有用於名單B.

每個點的最小距離的點由於總的組合超過10個十億,計算距離所用的時間太長。

有沒有一種方法可以確保列表B中的每個點都與列表A中的一個點相匹配,同時也提高了性能?

+0

我會考慮在問題中增加更多細節。像預期的最小距離是什麼?覆蓋區域有多大?球體的哪一部分? 「A」尺寸是固定的(或多或少)?你需要一個確切的解決方案?依此類推...最簡單的方法,根據數據而定,可能會也可能不會,在較小的列表上構建kdtree,然後使用它來映射RDD。 – zero323

回答

1

如果您已經創建了交叉產品並計算出了所有的軸距,那麼您已經完成了大部分工作,所以我將假設問題是如果您有新的A和B組應該怎麼做

要重複查找AI中的最近點,將構建某種包含A中的點的樹結構,並在樹的每個節點處存儲信息,該信息相當於一個包圍其所有後代的包圍盒或等效物。然後,當試圖在A中找到最接近的點時,遞歸搜索包含A的樹,在到達節點時從遞歸調用返回,並且可以根據存儲的信息計算出它的所有後代離目標點更遠比迄今爲止最接近的匹配。

對於此代碼的工作,邊界框信息需要準確,但如果樹是愚蠢的,它會減慢搜索速度,但不會阻止它們找到正確的答案。這意味着,特別是,當您構建樹時,您可以放心地忽略在180W = 180E處纏繞的不便習慣。你可以假設lat-long是一個矩形網格並構建一棵kd樹,你可以結合緯度和經度並對它們進行位交織並在結果上構建一維搜索樹,你可以計算https://en.wikipedia.org/wiki/Geohash並構建一個搜索樹基於這一點,或者你可以計算大量的海峽,並建立一個https://en.wikipedia.org/wiki/Cover_tree - 所有這些應該工作,我不知道哪一個最好 - 它可能取決於你的數據和你有可用的庫。