1

D3 では、ラボ サンプルを 8 行 x 12 列などのプラスチック 2D プレートにロードする様子を視覚化する必要があります。一度に行をロードすることもあれば、一度に列をロードすることもあれば、フラットな 1D 0..95 やその他の順序でロードすることもあります。ベース D3 の data() 構造は、行を列にネストする必要がありますか (またはその逆)、または 1 次元のままにしておく必要がありますか?

列 [columns[rows[]] に最適化されたデータを表すと、行ごとにロードするときにコードが複雑になり、その逆も同様です。フラット [0..95] で表現することは普遍的ですが、2D モードのすべての行と列の参照を計算する必要があります。共通の基盤からすべての順序付けを参照したいのですが、これまでのところ、それは勝ち負けの命題です。私は 1D フラットに傾き、計算を行っています。ウィンウィンはありますか?順序をパラメータ化または反転し、両方の方法で最適化する方法はありますか?

4

1 に答える 1

0

あなたの場合、最良の実装は連想配列(具体的には、そのハッシュテーブル実装)になると思います。キーは座標になり、値は保存されたデータになります。プログラミング言語によっては、何らかの方法でキーを処理する必要があります。

例:

[0,0,0] -> someData(1,2,3,4,5)
[0,0,1] -> someData(4,2,4,6,2)
[0,0,2] -> someData(2,3,2,1,5)

単純な連想配列を使用すると、挿入速度と読み取り速度が大幅に向上しますが、データ ブロックの複雑な選択が必要な場合、コードは混乱します。その場合、何らかのデータベースを使用するのが合理的かもしれません (ただし、連想配列のハッシュマップ実装よりは遅くなります)。特定のデータをバッチでクエリすることができます。たとえば、1 つの単純なクエリを使用して、データの行全体 (または複数の行) を取得できます。

SELECT * FROM data WHERE x=1 AND y=2 ORDER BY z ASC

または、3D データの中央から 2x2x2 の立方体を選択するとします。

SELECT * FROM data WHERE x>=5 AND x <=6 AND y>=10 AND Y<=11 AND z >=3 AND z <=4 ORDER BY x ASC, y ASC, z ASC

EDIT: 実行時に次元のサイズが変わらない場合は、もう一度考えてみてください-最速のソリューションであるため、すべての数学を自分で使用して1次元配列を使用する必要があります。3 次元配列を配列の配列の配列として初期化しようとすると、要素への読み取り/書き込みごとに、必要なアドレスを見つけるためにメモリ内で 2 つの追加ホップが必要になります。ただし、次のような関数を記述します。

int pos(w,h, x,y,z) {return z*w*h+y*w+x;} //w,h - dimensions, x,y,z, - position

ほとんどのコンパイラでインライン化され、かなり高速になります。

于 2013-03-08T07:00:47.197 に答える