0

属性の数が実行時に決定される一連の属性を持つデータを処理する必要があります。たとえば、データセットには動物が含まれ、属性には性別、種、年齢などが含まれる場合があり、各属性は整数 (または列挙型) で表すことができます。たとえば、男性の総数や犬の数などをすばやく計算できるように、任意の次元に沿って反復できるようにしたいと考えています。

私は次のようなJavaインターフェースを考えています:

public interface DynamicMultidimensionalStore<T>
{
  Object getPoint(List<Integer> coordinates);
  void setPoint(List<Integer> coordinates, T item);
  Iterator<T> iterate(int dimension, List<Integer> remainingCoordinates);
  DynamicMultidimensionalStore<T> getSlice(int dimension, int offset);
}

まず、これには名前が必要です。キューブ?http://en.wikipedia.org/wiki/Spatial_index#Spatial_indexに似ていますが、これらは任意の軸を反復するのではなく、空間的な関係に重点を置いているようです。

私が考えることができる唯一の構造は、データを線形配列に格納し、ポインター演算を実行してオフセットを計算するクラスです。

より良い解決策はありますか?配列がまばらになる(または次元が大きくなる)につれて、私のアプローチは効率が低下すると思います。

4

1 に答える 1

1

あなたの質問を正しく理解していれば、機能する「スパースソリューション」は次のとおりです。変数ごとに 1 つずつ、辞書のリストとしてデータ セットを表します。関連するプロパティをキーにして、アイテムへの参照を各ディクショナリに挿入することにより、アイテムを保存します。したがって、次のようなデータになります

{
  feet = {1: {<slug>}, 2: {<bird>, <person>}, 4: {<dog>}},
  fur  = {yes: {<dog>}, no: {<slug>, <bird>, <person>}},
  ...
}

ここで<slug>は、オブジェクト タイプの単一のインスタンスへの参照/ポインタとして読み取る必要があります。私は Java についてよく知らないので具体的には言えませんが、たとえば C++ での実装でstd::mapは、パラメーターの可能な値に対してキーを使用できます。次に、値は一般的なコレクションとして保存されstd::listますstd::set。あなたがより凝っていたなら、おそらくstd::multimapもっと適しているでしょう-私は完全にはわかりません.

特定のプロパティを持つオブジェクトのカウントは非常に高速である必要があります。ハッシュ テーブルで検索するコンテナーの長さを照会することになります。主な欠点は、n*kポインター (または参照など) がnあることです。ここで、 はオブジェクトkの数で、 は軸の数です。これはあなたにとって良いかもしれないし、そうでないかもしれません。

于 2012-08-21T22:33:28.617 に答える