为什么我的项目产生的代码太大"编译时错误?

时间:2016-08-26 12:34:11

标签: java performance sudoku

我有this code,当我尝试编译它时,它会返回:

E:\temp\JavaApplication12\src\javaapplication12\JavaApplication12.java:15: error: code too large
    public static void main(String[] args) {
1 error

我的代码是数独求解器。首先,我需要加载所有数字,然后处理行和列中已存在的数字,以决定我可以解决的问题。但它没有编译代码!我花了几周时间研究这个问题。

我的数独求解器的方法解决了 常数时间 中的问题。所以,我没有使用循环或数组,因为它会产生问题O(n)。我希望O(k) k是常量。

1 个答案:

答案 0 :(得分:1)

即使编译代码,它也不会解决数独游戏。实际上,如果81个变量bN中的任何一个等于aPQ,它所做的就是将9个变量N设置为true。

它甚至不能有效地这个。有1458(= 18 * 81)条件将每个bN变量设置为true。 (简单检查:每个条件是3行; 9个变量中每个变量1458个检查:3 * 1458 * 9 = 39366,文件的大致长度)。

bN的所有设置者都是独立的,并且是幂等的,因此可以任意重新排列,并且可以删除对条件的重复检查。

此代码的等效(且效率很高)版本 - 使用数组 - 是:

// Using 10 as array size, as OP's code is one-based;
// first element is unused.
int a[][] = new int[10][10];
// Initialize the elements of a.
boolean b[] = new boolean[10];
for (int i = 1; i <= 9; i++) {
  for (int j = 1; j <= 9; j++) {
    if (a[i][j] >= 1 && a[i][j] <= 9) {
      b[a[i][j]] = true;
    }
  }
}

应该很容易适应方法的最大大小。

在考虑如何使其高效之前,您应该专注于编写正确的可维护的代码 - 这段代码不能用于其声明的目的,而且我我不想成为40k行代码中的bug所在的那个。我能够分析这么多代码的唯一原因是它似乎是生成的,因为它的模式非常统一。

我使用(非常hacky)Python脚本进行了上述分析。

使用:

运行
curl http://pastebin.com/raw/NbyTTAdX | python script.py

script.py

import sys
import re

with open('/dev/stdin') as fh:
  lines = fh.readlines()

bequals = re.compile(r'^b\d\s*= true;$')

i = 0

bvariablesetters = {}

while i < len(lines):
  if lines[i].strip().startswith('if (') and lines[i].strip().endswith('{'):
    # Match the conditionals setting one of the b variables.
    if lines[i+2].strip() == '}' and bequals.search(lines[i+1].strip()):
      newline = ' '.join(map(str.strip, lines[i:i+3]))

      spl = newline.split()

      # This is the "b=" variable
      bvar = spl[5]
      bvariablesetters.setdefault(bvar, []).append(' '.join(newline))
      i += 3
      continue
  else:
    # Print out lines which don't match the conditional-set-b pattern, so you
    # can see that there's nothing else going on.
    sys.stdout.write(lines[i])
    i += 1

# Print the number of conditionals setting each of the b variables.
print {(k, len(v)) for k, v in bvariablesetters.iteritems()}
# Print the number of unique conditionals setting each of the b variables.
print {(k, len(set(v))) for k, v in bvariablesetters.iteritems()}

# Print one of the lists of conditions to set a b variable.
print bvariablesetters['b1=']

# Print one of the sets of conditions to set a b variable.
print sorted(set(bvariablesetters['b1=']))