KD-Tree 學習筆記

MoyouSayuki發表於2024-07-28

KD-Tree 學習筆記

建樹

  1. 如果當前超長方體只有一個點,返回這個點
  2. 選擇一個維度(輪流)
  3. 選擇中位數(\(O(n)\)
  4. 遞迴

應用

  • 定理

二維 KDT 中節點代表矩陣與任意一個矩形(邊界上)有交的只有 \(O(\sqrt n)\) 個。

證明:

考慮一條直線,與KDT的交集,此層最多有兩個,遞迴得到遞迴式,然後套主定理。

增刪改查

  • 查詢
  1. 單點是否存在 \(O(\log n)\)
  2. 矩陣和:遞迴,只處理相交 \(O(\sqrt n)\)

剪枝:維護子樹支撐矩形。

  1. 最近鄰,\(k\) 近鄰 最壞 \(O(n)\),可以用支撐矩形最優性剪枝。
  • 修改

看做線段樹,區間就打懶標記

  • 插入

找到單點,然後切割喵 \(O(\log n)\)

  • 刪除

為了維護樹形,打刪除懶標記,或者像 BST 一樣,找到子樹內裡當前刪除點最近的同維度的點,交換到葉子上面,然後刪葉子。

  • 重構
  1. 暴力
  2. 替罪羊重構,維護子節點佔當前節點大小的比例,作為不平衡度,定義閾值重構。
  3. 根號重構,儲存待插入的點,每 \(B\) 次插入重構,修改均攤 \(O(\dfrac nB \log n)\),查詢均攤 \(O(B+\log n)\),最優 \(O(\sqrt{n\log n}\)
  4. 二進位制分組,分成 \(\text{popcount}(n)\) 組 KDT,每次插入合併,均攤 \(O(n\log^2n)\)

KDT 本質上是維護一些偏序關係,一般我們用矩形去套點。