既知のサイズの配列で単純なデータ型を特定の位置に移動する最も速い方法は何ですか?配列内の単純なデータ型を特定の位置に移動する最も速い方法
私はintとして記憶されたゲームボードを回転していた特定の場合には、[9]
[0,1,2,3,4,5,6,7,8]
私はそれぞれ回転に必要なこれらの配列のベクトルを持っていた私のユースケースで[6,3,0,7,4,1,8,5,2]
となります。
基板レイアウト:
board1|corners|centers
0 1 2 | 0 2 | 1
3 4 5 | | 3 5
6 7 8 | 6 8 | 7
board2|corners|centers
6 3 0 | 6 0 | 3
7 4 1 | | 7 1
8 5 2 | 8 2 | 5
私が思いついた最速の方法は、に配列エントリを割り当てるためのパブリック変数を作成し、バックメモリにコピーすることでした。
私はそれがはるかに遅いクロックする..thoughint[] b = new int[] {b[6], b[3], b[0], b[7], b[4], b[1], b[8], b[5], b[2]};
を推奨しています同様の質問 here、(単一スレッドの半分以下の速度)
どちらも比較的あるのを見てきた
int layout[9];
int pub_layout[9];
#include <cstring> // for std::memcpy
void rotate(int layout[])
{
pub_layout[4] = layout[4]; // center
pub_layout[0] = layout[6]; // corner four
pub_layout[6] = layout[8];
pub_layout[8] = layout[2];
pub_layout[2] = layout[0];
pub_layout[1] = layout[3]; // center four
pub_layout[3] = layout[7];
pub_layout[7] = layout[5];
pub_layout[5] = layout[1];
std::memcpy(layout,pub_layout,sizeof(pub_layout));
}
高速(see a test here)
これが最速の方法でない場合は、何ですか?
私はアルゴリズムがCとC++の両方で同じであると思われます。
あなたが投稿したテストコードにいくつかの問題があります。 'rotate2()'関数は動的メモリ割り当て(そのサンプルコード内のすべてのリーク)を含みますが、 'rotate()'はそうではありません。したがって、 'rotate2()'が遅いのは驚くべきことではありません。 [Here](http://coliru.stacked-crooked.com/a/bc6b9bc5ecfd42ce)は、C++ 11のコンテナとアルゴリズムを使用するわずかに変更されたコードです。この場合、 'rotate()'と 'rotate2()'は匹敵し、動的メモリ割り当てを伴わない。 – crayzeewulf
あなたはそれを行順に保存していないと考えましたか? '0、1、2、5、8、7、6、3、4'の順番で格納し、' int'の代わりに 'char'を使用した場合、ボードを回転させるだけで最初の8要素最後の要素(位置4)は不変になります。 – Alnitak
さらに、これらの8つの要素を単一の「長」に格納することで、2つの24ビットシフト演算と少しのビットマスキングで回転を実現できます。 – Alnitak