我正在尝试用Java优化一个类的算法(数独),我想知道以下内容:
* 1。 int的大小是否会显着影响基本操作的执行速度? 我将一个长8位数与2位数长
分开* 2。有没有办法使用二进制?或者是bitfields(我不确定bitfields是如何工作的)
例如,我需要存储每个方块的允许值,而不是使NxNxN数组有任何方法只有一个NxN数组,每个行/列存储像011010001这样意味着2,3,4, 9可以放在那个位置?我可以做boolean我猜,但我还计划将每个多维数组转换为单个维度(因为我听说Java将2D数组视为不同于c ++的数组数组)然后修改每个值(这将适用于整数)。 / p>
* 3。如果以上是可能的,那么使多维数组存储布尔值更有效,或者更有效地使单个数组长度N ^ 2或N ^ 3具有整数。 如果它有所不同,N将介于9和25之间。我并不十分担心9,但我觉得25 ^ 3可以让我回到原点。
我不知道我是否应该期待一个明确的答案,但任何见解或估计都会很棒。
答案 0 :(得分:0)
每个int
都是32位宽。设置这些位的数量并不重要。
当然,您可以访问int
中的各个位,这就是bitwise and bit shift operators的用途。
是的,用boolean[]
替换int
将加速操作,特别是如果需要对int
中的所有位应用相同的逻辑操作。例如,如果我们有行,列和框中可用数字的位掩码,我们可以找到单元格中可用数字的位掩码
int availableInCell = availableInRow & availableInColumn & availableInBox;
答案 1 :(得分:0)
无论值如何,整数除法应始终占用相同的时间。如果使用“long”而不是“int”,则可能需要更长时间(至少在32位机器上)。
您可以使用位移运算符(>>,>>>或<<)在int中存储多个布尔标志。您还可以使用按位和('&'not'&&')或按位或('|'not'||')来解析或存储int中的布尔标志。见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html。就效率而言,我不确定,这可能取决于算法的其他方面。
顺便说一句25 ^ 3 = 15625这不是很大。即使每个4字节25 ^ 3 * 4 = 62500这是64k,仍然不是很大。我更担心你的算法的CPU效率
答案 2 :(得分:0)
绝对有意义的是在一个元素的一维数组中表示网格,该元素至少具有您需要的位数。例如,对于正常的数独,短[81]就足够了。