ポイント クラスの各属性をベクトルのコンポーネントと見なす場合、選択プロセスはリージョン クエリになります。文字列属性が何かに等しいという例は、領域が実際にはデータ空間内の行であることを意味します。ただし、その選択内の他の属性に対してソートは行われません。自分で実装する必要がありますが、データを順序付けられた領域に分割する octree の場合は比較的簡単です。
別の回答で提唱されているように、最初に既存の標準ソリューションを試してください。これらのデータ構造のいずれかのシェルフ実装を見つけることができる場合:
- Rツリー
- KDツリー
- BSP
- Octree、またはより可能性が高いのは、quadtree または octree 原理のn 次元バージョンです (ここでは、一般的なデータ構造を示すために octree という用語を使用します)。
それからそれのために行きます。これらは、空間データ管理に推奨するデータ構造です。
空間データを操作できる組み込み RDBMS を使用することもできます (通常、空間インデックス作成用に R ツリーを実装します) が、データセットが動的でない場合は面白くないかもしれません。
データセットが 10000 エントリの範囲内に収まる場合、今日の標準ではそれほど大きくないため、より単純な構造を使用すれば十分です。その境界では、最初に単純なを使用しstd::vector
、 と を使用std::sort
しstd::find
て小さいセットのデータをフィルタリングし、後で並べ替えます。
2 回目の試行では、最もクエリの多い属性で順序付けられたセットまたはマップを試してから、いくつかのベンチマークを実行して、よりパフォーマンスの高いソリューションを選択します。
より効率的な 1 次元のインデックス作成アルゴリズム (本質的には、セットとマップが何であるか) については、B-treesを試してみてください。Googleから入手できる C++ 実装があります。
私の 3 回目の試みは、OpenCL ソリューションに向けたものです (OpenGL レンダリングを大量に実行している場合は、代わりに CPU で作業を行うことを好むかもしれませんが、それはフレームレートのニーズによって異なります)。
データセットがはるかに大きいように思われる場合は、最初にリストしたより複雑なソリューションの 1 つを検討してください。
いずれにせよ、データセットとそれをどのように使用する予定かについての詳細がなければ、適切なソリューションを提供することは難しいため、私たちが提供できる唯一の本当のアドバイスは、できる限りのことを試してベンチマークすることです.