0

私はプロトタイプを作成していますが、現在、ロードされているギアをどのように設計するかはわかりません。有効な2D配列のデルタデータ構造

目的は簡単です.2D配列のデルタを保存し、後でgetDelta(i、j)または他のインターフェイス経由で戻します。最適な圧縮は現在必要ではなく、配列のサイズメモリのO^2ではなく、パフォーマンスがあります。

詳細:デルタを形成

  1. いくつかのための稼働率で、アレイ全体のデルタを尋ねると1:1です。
  2. 現在、フロートデータが保存されていますが、実装の詳細としてこれを固定したくありません。
  3. デルタは固定サイズになっています。それは配列の行の量(または列;配列は常に正方形である)と同じです。
  4. これは、コンシューマーとライターのコードを同じ(または他の相互に既知の)順序で入れて読むことを再設計することは可能ですが、これを最適化するための最良の方法はわかりません。

p.s.これはJavaのタスクですが、C、Perl、Mathematica、Fortran、疑似コードやアイデアは歓迎しますが、他の言語ベースの例はあまり明確ではないかもしれません。効率的に「デルタ」(即ち、差)場合には2つの2Dアレイの間の値のほとんどが同じであると予想されるを格納する

答えて

1

、あなただけの要素の値を格納するhash map又はmapを使用することができそれは異なっている。

C++での迅速な実装:

#include <bits/stdc++.h> 
using namespace std; 

typedef float value_type; 
vector<vector<value_type>> original_array; 
map<pair<int, int>, value_type> different_elements; 

void calculate_delta(const vector<vector<value_type>> &another_array) { 
    int i, j; 
    for (i = 0; i < original_array.size(); ++i) { 
     for (j = 0; j < original_array[i].size(); ++j) { 
      if (another_array[i][j] != original_array[i][j]) { 
       // store the different element 
       different_elements.insert(make_pair(make_pair(i, j), 
                another_array[i][j]); 
      } 
     } 
    } 
} 

value_type get_delta(int i, int j) { 
    auto it = different_elements.find(make_pair(i, j)); 
    if (it == different_elements.end()) { 
     return original_array[i][j]; 
    } 
    return it->second; // return the stored value 
} 
+0

感謝。効率について言えば、ここで地図インターフェースの実装が重要です。あなたの推奨マップはどれですか?(ハッシュマップ/テーブルは添付されています) 最初のバージョンでは、HashMap(これもリンクしています)とSortedMap(黒赤色ツリーの実装)で同様のコードを生成します。これは、新しいキーオブジェクト世代と行列サイズからの演算をハッシュする方法が遅すぎることを示しました。これはメモリおよび関連する操作オーバーヘッド(外部には保存されませんが、Cの場合はガベージコレクションまたはデストラクト)です。 – Les

+0

@Lesハッシュマップでの挿入と検索のためのキーを生成すると、時間の複雑さは「O(1)」になります。ルックアップと挿入自体の*予想される*複雑さは、okay-ishハッシュ関数が 'O(1)'でもあると仮定しています。そして、すべての主要なプログラミング言語でのマップとハッシュマップの実際の実装はかなり効率的です。 「遅すぎる」ものを数量化し、既に考慮したアプローチについての詳細(コード)を示します。 – kfx

+0

はい、理論的なO(1)はここでもひどいパフォーマンスです。申し訳ありませんが、私は学術コンピュータサイエンスの同僚に同じフレーズを頻繁に言います。この問題に対するより良い角度は、delta putまたはget bulk操作全体のためのO( "array side size"^2)があることです。私はツアーベースのデルタの2つのプリミティブ配列(デルタとその行idx、プリミティブ配列の要素順序に含まれる別の情報)を書くだけですが、上の問題はまだ私に関係しています。 – Les