7

O(N)要素を含む次のスパース行列があります

boost::numeric::ublas::compressed_matrix<int> adjacency (N, N);

以下のように時間内にすべてのエントリを調べるブルートフォースダブルループを作成することもできますO(N^2)が、これは遅すぎます。

for(int i=0; i<N; ++i)
   for(int j=0; j<N; ++j)
       std::cout << adjacency(i,j) std::endl;

ゼロ以外のエントリのみを時間内にループするにはどうすればよいO(N)ですか?ゼロ以外の要素ごとに、その値とインデックスにアクセスしたいと思いますi,j

4

1 に答える 1

15

このFAQで答えを見つけることができます:ゼロ以外のすべての要素を反復処理する方法は?

あなたの場合は次のようになります。

typedef boost::numeric::ublas::compressed_matrix<int>::iterator1 it1_t;
typedef boost::numeric::ublas::compressed_matrix<int>::iterator2 it2_t;

for (it1_t it1 = adjacency.begin1(); it1 != adjacency.end1(); it1++)
{
  for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++)
  {
    std::cout << "(" << it2.index1() << "," << it2.index2() << ") = ";
    std::cout << *it2 << std::endl;
  }
}
于 2009-12-07T08:47:49.747 に答える