簡體   English   中英

保存點 (x_i, y_i) 的數據結構和查找 x_i > a & y_i > b 的所有點的過程

[英]Data structure that holds points (x_i, y_i) and a procedure to find all points that x_i > a & y_i > b

給定平面上的 N 個點 (x_1, y_1), ..., (x_n, y_n),需要描述一個包含所有點 (x_i, y_i) 的 DS 和一個過程 Farther(a, b),它將返回DS 中滿足 x_i > a & y_i > b 的所有點的數量,時間復雜度為 O(log^2(n))。

我想到並嘗試實現的基本上是一個 DS,它具有平面中點的兩個排序數組,而第一個數組根據 x 值排序,第二個數組根據 y 值排序。 然后通過二進制搜索最小的滿足 x 值來檢索所有滿足點很容易,然后檢查這些點是否 y 值也滿足。 這是直觀的解決方案,但需要 O(nlogn) 時間。

不幸的是,沒有設法提出更好的解決方案。

只要您不需要動態更新結構,我認為標准解決方案是部分持久的紅黑樹或類似的搜索樹。

部分持久的數據結構是一種可以在不失去對先前版本的訪問權限的情況下進行修改的數據結構。 這些在像 Haskell 這樣的純函數式語言中非常常見——因為每個對象都是不可變的,“修改”只是與舊版本共享盡可能多的數據的新版本,並且所有版本仍然可以使用。 Chris Okasaki 的紅黑樹很受歡迎。

所以,給定一個部分持久的紅黑樹,這個問題很容易解決:

  1. 按 X 倒序排列
  2. 將點插入樹中,按 Y 排序,並跟蹤為每個點創建的版本。

現在,當您需要找到所有 X>a 和 Y>b 的點時:

  1. 在 X 排序的點列表中進行二分搜索以找到 X>a 的最后一個。
  2. 獲取關聯的樹版本,它只包含 X>a 的點。
  3. 從最大 Y 遍歷樹,如果找到 Y<=b 則停止。

就是這樣——很簡單,只是樹結構本身有點棘手,而且很難找到某些語言的庫版本。 每次搜索需要 O(log N) 時間,數據結構本身需要 O(N) 或 O(N log N) 空間,具體取決於實現。

Kd 樹也可以用來解決這個問題,並且通常表現良好,盡管它們不能提供相同的復雜性保證。

暫無
暫無

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

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