Java 是否有一种方法可以快速找到数组中的所有位置是否为;完整的;?

Java 是否有一种方法可以快速找到数组中的所有位置是否为;完整的;?,java,reversi,Java,Reversi,如果我有一个64长度的java数组I[],除了在整个数组中循环外,是否有一种快速的方法来确定该数组中的每个位置是否都是“满的”?我正在写一个Reversi AI,我需要知道整个数组是否已满。您可以单独保留一些“空”单元格,并在每次移动后更新它 然而,我不认为有必要进行这种优化:长度为64的循环必须非常快。请尝试查看这是否是一个真正的瓶颈,以及优化是否值得您的努力。您可以使用两个黑白(或免费和iswhite)位集。保留一个类型为long(64位)的flags变量,并使用它通过设置或清除相关位来跟踪

如果我有一个64长度的java数组I[],除了在整个数组中循环外,是否有一种快速的方法来确定该数组中的每个位置是否都是“满的”?我正在写一个Reversi AI,我需要知道整个数组是否已满。

您可以单独保留一些“空”单元格,并在每次移动后更新它


然而,我不认为有必要进行这种优化:长度为64的循环必须非常快。请尝试查看这是否是一个真正的瓶颈,以及优化是否值得您的努力。

您可以使用两个黑白(或免费和iswhite)位集。

保留一个类型为
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
int[]grid=newint[64];
长满=0升;
//将工件放置在特定的网格位置
网格[17]=1;//假装1是黑色的代码

full |=1L
数组。asList(i).contains(EMPTY)
(可能您将
null
解释为空)。

在循环中不包含方法?这比在数组上迭代的明显方法效率低。写入和读取速度更快。我的意思是,如果我们谈论的是性能,我们就不会在每个位置使用数组元素——两个
长的
就可以了,比较可能需要一个简单的操作(在足够现代的处理器架构上)。我怀疑提供的任何方法在运行时都会比迭代数组更快。或者更重要的是,迭代一个64元素的数组就像是一个“性能瓶颈”。请注意,即使电路板没有完全填满,Reversi的Otherlo变体也可能结束。这意味着,有一些方法来判断棋盘是否已满(即使是非常快的棋盘),这并不是很有帮助,在宣布游戏结束之前,您仍然需要检查(n)任何一位玩家是否还有任何剩余的动作(即,将其放在极小极大树/图的叶子中)。(这意味着游戏可能在网格完全填满之前结束。from:.wikipedia.org/wiki/Reversi#Rules)如果我使用alpha-beta修剪方法,我必须在每次打开节点时查看网格是否已满。因此,有64^64个可能的循环。你现在明白为什么了吗?@Sam:在这种情况下,仅使用增量/减量来保持空单元格的数量必须比位操作(涉及索引计算)快。我假设如果我在位置i添加一个项,long+=2^i;对我添加了更多建议。(我会用大写字母L表示长常量。
-1L
vs
-1L
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