これは、使用されるインデックス構造の問題ではなく、クエリの問題です。
データセットから離れるほど、最近傍ははるかにあいまいになります。
したがって、他のインデックスが大いに役立つとは思えません。
ただし、検索にしきい値をプラグインできる場合があります。つまり、「最も近い隣人を見つけますが、最大距離x内にある場合のみ」です。
ユークリッド距離の静的なメモリ内の3次元点二重ベクトルデータの場合、実際にはkdツリーを打ち負かすことは困難です。データを非常に高速に分割するだけです。八分木は時々速いかもしれませんが、ほとんどはウィンドウクエリのためだと思います。
オブジェクトが非常に少ないがクエリが数百万ある場合は、ハイブリッドアプローチを試すことができます。大まかに次のようになります。データセットの凸包上のすべての点を計算します。中心と半径を計算します。クエリポイントがx倍離れている場合(正しいxを計算するには、自分で3D計算を行う必要があります)、最近傍は凸包ポイントの1つである必要があります。次に、再びkdツリーを使用しますが、ハルポイントのみを含むものです。
またはさらに簡単です。各次元の最小/最大点を見つけます。たぶん、いくつかの極値を追加します(x + y、xy、x + z、xy、y + z、yzなど)。したがって、候補の小さなセットを取得します。それで今のところそれが8ポイントであると仮定しましょう。これらの6点の中心と距離を事前に計算します。中心からこれらの8点までの最大距離をmとします。クエリの場合、中心までの距離を計算します。これがmより大きい場合は、最初にこれら6つの候補のうち最も近いものを計算します。次に、kdツリーをクエリしますが、検索をこの距離に制限します。これには、1(近い場合)および7(遠い隣人の場合)の距離計算が必要であり、適切な候補を早期に指定することで、検索を大幅に高速化できます。さらにスピードアップするには、これらの6〜26個の候補をkdツリーに編成して、最適な境界をすばやく見つけます。