KD-Tree 學習筆記
建樹
- 如果當前超長方體只有一個點,返回這個點
- 選擇一個維度(輪流)
- 選擇中位數(\(O(n)\))
- 遞迴
應用
- 定理
二維 KDT 中節點代表矩陣與任意一個矩形(邊界上)有交的只有 \(O(\sqrt n)\) 個。
證明:
考慮一條直線,與KDT的交集,此層最多有兩個,遞迴得到遞迴式,然後套主定理。
增刪改查
- 查詢
- 單點是否存在 \(O(\log n)\)
- 矩陣和:遞迴,只處理相交 \(O(\sqrt n)\)
剪枝:維護子樹支撐矩形。
- 最近鄰,\(k\) 近鄰 最壞 \(O(n)\),可以用支撐矩形最優性剪枝。
- 修改
看做線段樹,區間就打懶標記
- 插入
找到單點,然後切割喵 \(O(\log n)\)。
- 刪除
為了維護樹形,打刪除懶標記,或者像 BST 一樣,找到子樹內裡當前刪除點最近的同維度的點,交換到葉子上面,然後刪葉子。
- 重構
- 暴力
- 替罪羊重構,維護子節點佔當前節點大小的比例,作為不平衡度,定義閾值重構。
- 根號重構,儲存待插入的點,每 \(B\) 次插入重構,修改均攤 \(O(\dfrac nB \log n)\),查詢均攤 \(O(B+\log n)\),最優 \(O(\sqrt{n\log n}\)。
- 二進位制分組,分成 \(\text{popcount}(n)\) 組 KDT,每次插入合併,均攤 \(O(n\log^2n)\)。
KDT 本質上是維護一些偏序關係,一般我們用矩形去套點。