2

關於this question的闡述,但有更多限制。歐幾里得數據密度可變的簡單k最近鄰算法?

這個想法是相同的,找到一個簡單,快速的2個歐幾里德維數最近的鄰居算法。如果您可以找到適合分區數據的網格大小,則分流網格似乎可以很好地工作。但是,如果數據不是均勻分佈的,而是密度非常高和非常低的地區(例如美國人口),那麼沒有固定的電網規模可以保證足夠的鄰居和效率?這種方法是否仍能挽救?

如果沒有,其他的建議將是有益的,但我希望的答案比移動到KD樹那麼複雜等

回答

1

如果你沒有太多的元素,只是比較每一個與所有其他人。這可能會比你想象的要快得多;今天的機器是快速。不幸的是,平方因素遲早會抓住你;我認爲對一百萬個物體的線性搜索不需要太長的時間,所以你可能會有多達1000個元素。使用網格,甚至條紋,可能會大大提高這個數字。

但我認爲你被困在四叉樹(k-d樹的特定形式)。你的整個地圖是一個塊,其中可以包含四個子塊(左上,右上,左下,右下)。當一個塊填充的元素多於你想進行線性搜索時,將其分解爲更小的元素並傳輸元素。 (只有葉節點具有元素。)在給定點的給定半徑內進行搜索很容易。從頂部開始,如果塊的一部分位於點的範圍內,請檢查它的子塊是否具有相同的方式。如果沒有,請檢查其元素。 (當搜索「最接近」時,要小心,方格意味着距離較近的物體可能位於一個更遠的區域內,必須將所有物體都放在給定的半徑內,然後檢查它們是否全部如果你想要10最接近,你的半徑20只拿起5,你需要嘗試更大的半徑,你可能有一個被拒絕的項目,證明是30遠,認爲你應該抓住它和其他幾個人來彌補你的10。可能是25個客場中的一些物品,整個街區都被拒絕了,而你卻想要它們,應該有更好的解決方案,但我還沒有弄明白,我只是猜測半徑和雙倍直到我得到足夠的。)

Quadtrees很有趣。如果你可以設置你的數據然後訪問它,那很容易。當你試圖找出誰在接近什麼時,你的映射元素出現,消失和移動時會出現問題。