疎行列(ほとんどの要素がゼロであるスカスカな行列)は、2次元配列で実装するとメモリの無駄遣いになるので、サイズが大きいなら連想配列で実装したほうが良い。C++でのやっつけな実装例。
#include<stdio.h> #include<map> // 疎行列 class SparseMatrix { public: typedef std::pair<int,int> Index; // (i,j)の組 typedef std::map<Index, int> Map; // (i,j)-> の連想配列 // (i,j)の値を取得する int get(int i, int j) { // (i,j)を連想配列から探す Map::iterator it = m_map.find( Index(i,j) ); if( it == m_map.end() ){ return 0; // 見つからなければゼロ }else{ return it->second; // 見つかったら対応する k を返す } } // (i,j)の値 k を設定する void set(int i, int j, int k) { m_map[ Index(i,j) ] = k; } // 行列をゼロクリアする void clear(void) { m_map.clear(); } // ゼロでない (i,j)->k をリスト表示する void dump(void) { printf("Dump:\n"); Map::iterator it = m_map.begin(); while( it != m_map.end() ) { int i = it->first.first; int j = it->first.second; int k = it->second; printf("(%d,%d)->%d\n",i,j,k); it++; } } private: Map m_map; // 連想配列 (i,j)->k }; // テストプログラム int main(void) { SparseMatrix A; A.clear(); A.set(1,1,1); A.set(10000,0,100); printf("A(0,0) = %d\n",A.get(0,0)); printf("A(1,1) = %d\n",A.get(1,1)); A.dump(); char s = getchar(); return 0; }