4

長い質問になりますが、深呼吸してから読んでください。

1 次元配列のインデックスを多次元配列のベクトル インデックスに変換する最速のアルゴリズムを理解したいと思います。

なぜそれが必要なのかを理解するために、例を見てみましょう。

私は 2 次元配列を持っています: Array[i1][i2]

i1 は i1_b=0 から i1_e=2 まで実行されます

i2 は i2_b=0 から i2_e=1 まで実行されます

したがって、この配列はファイルに 1 行ずつ出力されます。

配列[0][0]

配列[0][1]

配列[0][2]

配列[1][0]

配列[1][1]

配列[1][2]

ここで、ファイルを 1 行ずつ読み取ります。インデックス k は、最後に読み取られる行の番号です。

Array[0][0] と k=0 である最初の行を読みました

Array[0][1] と k=1 である 2 行目を読みました

...

k は k_b=0 から k_e=5 までで、

k=0 は i1=0、i2=0 に対応します

k=1 は i1=0、i2=1 に対応します

...

問題: だから私の問題は、k を i1 と i2 に最速で変換する方法ですか? (ファイルの読み取り中は必要ありませんが、後でプログラムで必要です)

この例では、ソリューションの 1 つが次のようになります。

i1=k/(i1_e - i1_b + 1);

i2=k%(i1_e - i1_b + 1);

質問 1: サイクルとコンピューター時間の点で最速のソリューションですか?

わかった。質問 2: このアルゴリズムを多次元配列に一般化するにはどうすればよいですか?

配列[i1][i2][i3][i4]

i1=k/(i1_e - i1_b + 1);

i2=k%(i1_e - i1_b + 1);

i3=i2/(i1_e - i1_b + 1);

i4=i2%(i1_e - i1_b + 1);

質問 3: それが最速の方法ですか?

質問 4: 関連する質問は、剰余除算、整数除算、整数の加算、および整数の乗算のレイテンシはどのくらいですか? これらの数値がアーキテクチャに依存する場合は、私にも知らせてください。

前もって感謝します!

PS この問題を、秒を日-時-分-秒に変換する最速のアルゴリズムと考える方が簡単かもしれません。

4

2 に答える 2

7

質問 2: このアルゴリズムを多次元配列に一般化するにはどうすればよいですか?

配列がある場合arr[dim_1][dim_2]...[dim_n]、方程式があります

k = i_1*(dim_2*...*dim_n) + i_2*(dim_3*...*dim_n) + ... + i_{n-1}*dim_n + i_n
  = i_1*(dim_2*...*dim_n) + r_2

そうi_1 = k / (dim_2*..*dim_n)そしてr_2 = k % (dim_2*...*dim_n)、そして

i_2 = r_2 / (dim_3*...*dim_n) and r_3 = r_2 % (dim_3*...*dim_n)

等、

i_j = r_j / (dim_{j+1}*...*dim_n) and r_{j+1} = r_j % (dim_{j+1}*...*dim_n)

i_n = r_nが見つかるまで。

質問 3: それが最速の方法ですか?

コンパイル時に次元がわかっている場合、除算は乗算、シフト、加算/減算に置き換えることができます。多くのアーキテクチャでは、除算命令よりも高速です。他の人ではありません。

ただし、その配列で多くのインデックス作成を行っており、それ以外はあまり行っていない場合にのみ、検討する価値があります。

質問 4: 関連する質問は、剰余除算、整数除算、整数の加算、および整数の乗算のレイテンシはどのくらいですか? これらの数値がアーキテクチャに依存する場合は、私にも知らせてください。

これらの数値は、アーキテクチャとプロセッサによって異なります。

于 2012-07-20T21:17:38.167 に答える