簡體   English   中英

給定n個點,我怎樣才能找到給定距離的點數

[英]Given n points, how can I find the number of points with given distance

我有n 個唯一點 (X,Y) 的輸入,它們介於 0 和 2^32 之間(含)。 坐標是整數。

我需要創建一個算法來查找距離正好為 2018 的點對數。

我曾考慮過檢查所有其他點,但它會是O(n^2) ,我必須讓它更有效率。 我還考慮過使用集合或向量,並使用比較器根據與原點的距離對其進行排序,但這根本無濟於事。

那么我怎樣才能有效地做到這一點呢?

您可以嘗試使用Quadtree 首先,您開始將您的點排序到四叉樹中。 您應該為像元大小指定一個下限,例如 2048,它是 2 的冪。然后遍歷這些點並計算到同一像元中的點和相鄰像元中的點的距離。 這樣,您應該能夠大大減少距離計算的數量。

主要的困難可能是實現樹形結構。 您還必須找到找到相鄰單元格的方法(您必須包括在樹中向上遍歷的可能性)

四叉樹圖像

這的復雜性可能是 O(n*log(n)) 但不要把我固定在那個上面。

關於距離計算的另外一個詞:如果你不這樣做,你可能會快得多

dx = p1x - p2x;
dy = p1y - p2y;
if ( sqrt(dx*dx + dy*dy) == 2018 ) {
    ...
}

dx = p1x - p2x;
dy = p1y - p2y;
if ( dx*dx + dy*dy == 2018*2018 ) {
    ...
}

平方比取平方根更快。 因此,只需將距離的平方與 2018 年的平方進行比較。

有一個斜邊為 2018 的畢達哥拉斯三元組: 1118 2 +1680 2 =2108 2

由於所有坐標都是整數,因此兩點的坐標(X 和 Y)之間唯一可能的差異是 0、1118、1680 和 2018。

查找 X(或 Y)坐標之間具有給定差異的所有點對是一個簡單的n log n操作。

讓我給你一個建議:

兩點 (X1, Y1) 和 (X2, Y2) 之間的距離等於:

sqrt((X2 - X1)^2 + (Y2 - Y1)^2)

因此,您可能會考慮檢查:

sqrt((X2 - X1)^2 + (Y2 - Y1)^2) <= 2018

但是,您可以輕松地將其簡化為:

(X2 - X1)^2 + (Y2 - Y1)^2 <= 2018^2  // or:
(X2 - X1)^2 + (Y2 - Y1)^2 <= 4072324

在這里,您已經放棄了平方根的計算,這是一個性能殺手。

接下來,有一個簡單的觀察,如果 X 或 Y 坐標彼此之間的距離大於 2018,那么距離肯定會大於 2018,因此,您可以執行以下操作:

boolean close_enough (double X1, Y1, X2, Y2)
{
    if ((abs(X2 - X1) > 2018) || (abs(Y2 - Y1) > 2018))
      return false;
    else
      return ((X2 - X1)^2 + (Y2 - Y1)^2 <= 4072324);
}

如您所見,性能優化不僅僅是大 O 符號的問題:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM