【问题标题】:does size of int matter? sudoku optimizationint 的大小重要吗?数独优化
【发布时间】:2013-11-26 08:49:19
【问题描述】:

我正在尝试在 Java 中为一个类优化算法(数独),我想知道以下内容:

*1。 int 的大小是否会显着影响执行基本操作的速度? 即划分一个 8 位长与 2 位长的 int

*2。有没有办法使用二进制?或位域(我不确定位域是如何工作的)

例如,我需要存储每个正方形的允许值,因此有没有办法让每行/列只存储一个 NxN 数组,而不是创建一个 NxN 数组,存储类似于 011010001 的内容,这意味着 2、3、4、 9 可以放在那个位置?我猜我可以做布尔运算,但我也计划将每个多维数组转换为一维(因为我听说 Java 将 2D 数组视为与 c++ 不同的数组数组)然后修改每个值(这将与整数一起使用)。

*3。如果上述情况可行,那么让多维数组存储布尔值会更有效,或者让单个数组长度为 N^2 或 N^3 的整数更有效。 如果有所不同,N 将在 9 和 25 之间。我不太担心 9,但我觉得 25^3 可以让我退缩很多。

我不知道我是否应该期待一个明确的答案,但任何见解或估计都会很棒。

【问题讨论】:

标签: java arrays optimization binary int


【解决方案1】:

无论值如何,整数除法都应始终花费相同的时间。如果您使用“long”而不是“int”,则可能需要更长的时间(至少在 32 位机器上)。

您可以使用位移运算符( >> 、 >>> 或 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html。至于效率我不确定,这可能取决于您算法的其他方面。

顺便说一下 25^3 = 15625 这不是很大。即使每个 int 4 字节 25^3*4=62500 是 64k,仍然不是很大。我会更担心你算法的 CPU 效率

【讨论】:

  • 是的,但我担心如果我在该循环中有几个甚至是原始操作,并且如果循环嵌套在另一个循环中,它会显着减慢它吗?
【解决方案2】:

每个int 都是 32 位宽。设置多少位并不重要。

当然,您可以访问int 中的各个位,这就是bitwise and bit shift operators 的用途。

是的,将boolean[] 替换为int 将加快操作速度,尤其是在需要对int 中的所有位应用相同的逻辑操作时。例如,如果我们在行、列和框中有可用数字的位掩码,我们可以通过

找到单元格中可用数字的位掩码
int availableInCell = availableInRow & availableInColumn & availableInBox;

【讨论】:

  • 如果我理解正确的话,availableInRow 等会是 0 还是 1?它有什么特殊的格式吗?我看到了 0b、0x 和其他的有什么不同吗?
  • 不,每个int包含32位,其中9位用于表示,对于9个数字中的每一个,该数字是否仍然可用。例如,0b111111111 表示所有 9 个数字仍然可用。要访问数字中的单个位,请使用移位运算符。
【解决方案3】:

在元素的一维数组中表示网格是绝对有意义的,该元素至少具有您需要的位数。例如,对于普通的数独,短 [81] 就足够了。

【讨论】:

  • 代码必须灵活适应更大的数独网格。是否会在其他适用于整数的任何方法或操作中使用短限制?
  • 如果您需要超过 16 位,可以。使用 int[] 或 long[] 也没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多