私は64の長さのJava配列i []を持っている場合、その配列のすべての位置が配列全体をループするのではなく「フル」であるかどうかを素早く調べることができますか?私はReversi AIを書いており、配列全体がいっぱいであるかどうかを知る必要があります。配列内のすべての位置が「完全」であるかどうかを素早く見つける方法はありますか?
答えて
long
(64ビット)タイプのflags変数を保持し、適切なビットを設定またはクリアすることによって、どのアレイエントリが「フル」であるかを追跡するために使用します。 (アレイエントリと同期させておく必要があります)
ビットごとに1
の値を使用すると、関連するセルがいっぱいであることを意味する場合は、アレイ全体が満たされているかどうかを、フラグ変数を-1L
に設定します。
実装例
int[] grid = new int[64];
long full = 0L;
// place a piece at a certain grid position
grid[17] = 1; // pretend 1 is the code for black
full |= 1L << 17; // set bit 17 in our "full" tracker
// is the grid full?
if (full == -1L)
// yes it is!
else
// no it isn't
あなたも、より狡猾こと、そしてあなたが完全に配列を使用して避けることができますので、あまりにも各セルの色を追跡するためのフラグ変数を使用することができます。 1つの変数は、与えられたセルが占有されているかどうかを追跡し、もう1つは色を追跡します(白は0、黒は1)。
long colour = 0L;
long full = 0L;
// set position 17 to white
colour &= ~(1L << 17); // clear the bit (white)
full |= (1L << 17); // set it to occupied
// set position 42 to black
colour |= (1L << 42); // set the bit (black)
full |= (1L << 42); // set it to occupied
// is position 25 occupied?
if ((full & (1L<<25)) != 0) {
// yes, but what colour?
if ((colour & (1L<<25)) != 0)
// black
else
// white
}
// is the grid full?
if (full == -1L)
// yes it is!
else
// no it isn't
+1イタチでいっぱいの樽より狡猾です。 – mcfinnigan
私は位置iにアイテムを追加すると仮定しています。 long + = 2^i; –
はい。私はより多くの提案を追加しました。 –
複数の「空の」セルを個別に保持し、移動するたびに更新することができます。
しかし、私はこの最適化の必要性を見ません:長さ64のループは非常に高速でなければなりません。これが本当のボトルネックかどうか、最適化があなたの努力の価値があるかどうかを試してみてください。
アルファベータプルーニング法を使用している場合は、私はノードを開く時間。したがって、64^64回のループが発生する可能性があります。 なぜ今すぐに見えますか? –
@Sam:この場合、空のセルの数を維持するために増分/減分を使用するだけでは、ビット演算(インデックス計算を伴う)より高速でなければなりません。 – Vlad
白黒(またはフリーホワイトiswhite)に2つのBitSetsを使用できます。
なんて!(黒||白) –
Arrays.asList(i).contains(EMPTY)
(おそらくあなたは空を意味するnull
を解釈しています)。
メソッドが順番にループしませんか? – sgowd
これは、配列を繰り返し処理する明白なアプローチよりも効率が悪いです。 –
書き込みと読み込みが速くなりました。私たちがパフォーマンスについて話していたら、それぞれのポジションで配列要素を使用することはありません.2つの 'long'が実行するでしょう。そして、比較はおそらくは(十分に最新のプロセッサアーキテクチャ上の)単一の単純な操作を取るでしょう。 –
- 1. 配列内の最小要素の位置を見つける良い方法はありますか?
- 2. 素早く配列から行を見つける方法
- 3. jQueryを使用して要素のページ内の位置を見つける方法はありますか?
- 4. HTMLテキストエリア内のカーソル位置(X/Y、行/列ではない)を見つける方法はありますか?
- 5. 2つの異なる配列のすべての要素のペアを素早く見つける方法
- 6. 最後の位置パラメータを見つける方法はありますか?
- 7. クラスの完全修飾名を素早く見つける方法
- 8. 円の周りを最も素早く見つける方法はありますか?
- 9. 文字列の特定の部分が始まる位置を見つける方法はありますか?
- 10. アイテムが前のアイテムと異なるリスト内の位置を見つける方法はありますか?
- 11. 配列内の最小要素の位置を見つける
- 12. 2次元配列内の要素のオカレンスのインデックスを見つけるコンパクトな方法はありますか?
- 13. Javascriptで数字を並べ替える方法と、ユーザーの入力を受けて要素の位置を見つける方法はありますか?
- 14. 配列要素が空であるかどうかを調べる方法は?
- 15. xpathがIEで有効かどうかを素早く確認する方法はありますか?
- 16. XPathステートメントから文字列の位置(インデックス)を見つける方法はありますか?
- 17. バインディングフォームですべてのシンボルを見つける方法はありますか?
- 18. ある配列のどの要素が他の要素の近くにあるかを見つける最も効率的な方法は何ですか?
- 19. ソートされた配列内で素早く要素を見つける
- 20. ある配列の要素が別の配列の要素数であるかどうかを調べる
- 21. 円内のすべてのブロックをグリッド内で見つける方法はありますか?
- 22. 配列内の位置/インデックスでドキュメントを見つける方法は?
- 23. 配列のすべての要素が特定の値であるかどうかをチェックする方法?
- 24. 変数の位置を見つける機能はありますか?
- 25. 地理位置:誰かが高度で上がっているかどうかを見つける方法がありますか?
- 26. 次の出力で配列内のすべての要素を出力する方法はありますか?
- 27. Javaで要素位置の配列を見つける
- 28. 配列が2次元配列の要素の1つであるかどうかをチェックする方法
- 29. 配列内の特定の数字の位置を見つける方法は?
- 30. ウェブページ上のどの要素がHTTPSを壊すかを見つける方法はありますか?
私は、提供されたメソッドのいずれかが、配列を反復するよりも実行時に高速であるとは思っていません。あるいは、もっと重要なことに、64要素配列を反復することは、「パフォーマンスボトルネック」のようなものになります。 –
ボードが完全には満たされていない場合でも、Reversiのオセロ変種は終了できます。これは、ボードがいっぱいであるかどうか(非常に速いものであっても)だけには何の意味もないことを意味することはあまり役に立ちませんが、ゲームを宣言する前に(n) (つまり、それをMinimaxツリー/グラフの葉に置きます)。 (*これは、グリッドが完全に塗りつぶされる前にゲームが終了することを意味する* from:.wikipedia.org/wiki/Reversi#Rules) –