我有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
是常量。
答案 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=']))