0

行と列をA[n,m]持つ2 次元配列と、ランダムに選択されたその配列の要素が与えられます。次にアクセスする要素が になるという点で、配列は円形であると考えてください。nmRA[n-1, m-1]A[0, 0]

element から始めて、各要素に一度だけアクセスし、次の要素に移動する前にR関数を呼び出します。foo()

以下は私の最初の実装ですが、バグがあります。xと の間のどこかの行から開始する0と、その列の からまでのn-1要素にアクセスできないというバグがあります。0x-1

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

// Look at each column once
for (int i = 0; i < m; ++i) 
{
  for (; curr_row < n; ++curr_row) 
  {
    foo(A[curr_row][curr_col]);
  }
  curr_row = 0;
  curr_col = (curr_col + 1) % m;
}

上記の要件を満たすように、このトラバーサルを行うクリーンな方法は何ですか?

4

3 に答える 3

1

c ではかなりさびていますが、同じはずです:

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

//first row
for(int j=curr_col;j<m;++j)
  foo(A[curr_row][j]);

//rest of the rows
for(int i=(curr_row+1)%n;i!=curr_row;i=(i+1)%n)
  for(int j=0;j<m;++j)
      foo(A[i][j]);

//first row , going over missed cells
for(int j=0;j<curr_col;++j)
  foo(A[curr_row][j]);

パフォーマンスを重視する場合は、「%」がまったくないように 2 番目のループを分割することもできます。

Cには単純な配列に2次元配列があるため、別の代替手段:

// Init - pretend rand() always returns valid index in range
curr_row = rand();
curr_col = rand();

int start=curr_row*m+curr_col;
int maxCell=n*m;
int end=(start-1)%maxCell;    

for(int i=start;i!=end;i=(i+1)%maxCell)
  foo(A[i]);
foo(A[end]);

あちこちに小さな数学のバグがある可能性がありますが、アイデアは問題ありません。

于 2013-01-09T22:11:19.647 に答える
1

次のインデックスに移動し、最初に戻ったかどうかを確認します。その場合は停止します。

// should be something that guarantees in-range indices
curr_row = rand();
curr_col = rand();
int i = curr_row, j = curr_col;
do {
    foo(A[i][j]);
    ++j;
    if (j == n) {
        j = 0;
        ++i;
        if (i == m) {
            i = 0;
        }
    }
}while(i != curr_row || j != curr_col);

これは、実装が行うことではなく、質問のタイトルが求めていることを行います。

于 2013-01-09T22:16:54.733 に答える
-1

A[curr_row, curr_col]多次元配列のメンバーにアクセスするために使用される構文ではありません。A[curr_row][curr_col]代わりに、配列が正しく宣言されていると仮定して、必要です。A[curr_row, curr_col]コンマ演算子を呼び出します。これは最初の値を効果的に計算し、それを破棄して 2 番目の値を計算し、その値で配列にインデックスを付けます。

于 2013-01-09T22:15:18.067 に答える