Kd木
まだ調べていない矩形がこの球と重ならないなら、その矩形がより近い近傍点を含むことはない。これを全ての領域が捨てられるか探索されるまで繰り返す。そして、最終的に残った点が最近傍となる。さらにこのアルゴリズムは、単に最近傍を求めるだけでなく、最近傍の距離の二乗も求められる。このアルゴリズムの時間計算量は O(logN) である。
このアルゴリズムは簡単な修正で拡張する方法がいくつか存在する。
近似最近傍探索は、単に木構造上で調べる点の個数の上限を決めておくか、探索にかかる時間を決めておいて割り込むことで実現される(後者はハードウェアによる実装にふさわしい)。木構造にすでに含まれている座標の点の最近傍を求める場合、常に距離が0の点が存在するはずであり、近似によって探索を打ち切るとそれを求めることができないという問題がある。
近似最近傍探索は劇的に計算時間を抑えられるため、ロボット工学などのリアルタイム性が要求される場合によく使われる。
軸に対応した分割平面の選択方法は様々なものがあり、kd木の構築方法も様々である。典型的なkd木の構築方法は以下のようになる。
木構造を下降すると共に、分割平面を選択する軸を巡回するようにする。例えば、根においてx軸に垂直な平面とし、根の子ではy軸に垂直な平面とし、根の孫ではz軸に垂直な平面とする、というように軸を巡回するように選択していく。
各ステップで、分割平面生成で選択される点は、kd木に入れる全ての点の対応する軸の座標値の中央値となる点とする。なお、前提として全ての点の集合がアルゴリズムの先頭で得られるものとする。
この方法では平衡kd木が得られ、各葉ノードと根との距離は等しくなる。しかし平衡木があらゆる応用において最適とは限らない。
また、常に中央値となる点を選択することが求められているわけではない。中央値を気にしない場合、単に平衡木となることが保証されないだけである。