【发布时间】:2016-12-22 06:07:00
【问题描述】:
我需要用一些逻辑填充int[2000][2000] 矩阵。
我的数组填充代码:
// n: (1 to 2000)
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
uniMatrix[i][j] = (((calc(i * j * i * j)) & 1) == 0) ? 0 : 1;
}
}
这里:i * j * i * j 是我对获得i*j 的平方的看法。
calc() 是一种用于获取值的方法。然后,我检查calc() 返回的值是偶数还是奇数。如果是偶数,我将0 存储在(i, j) 的矩阵中,否则我将1 存储在其中。
我的calc()函数如下:
private static int calc(int n){
// value of n=calc(1 | 2 | 3) is known
if(n < 4) return n;
// if value is present in HashMap, return it (don't calculate again)
if(map.containsKey(n)) {
return map.get(n);
}
// calculate the answer
int answer = 1 * calc(n-1) + 2 * calc(n-2) + 3 * calc(n-3);
// store it in HashMap so that we don't have to recalculate it
map.put(n, answer);
return answer;
}
现在,如果 n 是 13,它会创建一个 [13x13] 矩阵。但是,对于n=14,它会在map.containsKey(n) 处抛出一个StackOverflowError。我需要能够制作 [2000x2000] 矩阵。
我知道问题可能是递归。但是,有没有办法解决这个问题?我可以用 BitSets 做点什么吗(我不知道该怎么做)?
我也可以使用其他数据类型矩阵:String[][] 或 boolean[][]。我不能使用 Java SDK/JDK 之外的库。
编辑:它不是“什么是 StackOverflowError?”的重复,我知道它是什么,我知道它们为什么会发生。我需要帮助来寻找替代方法来防止出现此错误。
【问题讨论】:
-
所以当
i是1999 并且j是1999 时,您将拥有一堆i * j * i * j- 不要认为这有点过分? -
问题肯定是递归。位集和其他数据类型在这里对您没有帮助。将函数转换为迭代函数。
-
事实:我们可以将每个 SOE 问题标记为“什么是 SOE”问题的重复项。只是因为它涵盖了“什么”“如何”“为什么”“预防”。对?我需要一个替代方案。我知道它为什么会被抛出(而且我知道我不应该使用递归)。
-
@rupinderjeet 请参阅下面的链接。我认为
cal(100)会给你带来很小的价值,因为你使用了int。如果我误解,请纠正我。 docs.google.com/spreadsheets/d/… -
我的速度有点太快了。但是,您只需要知道每个
calc(n)的奇偶校验(奇偶校验)。肯定有一个模式,尽管它比我一开始想象的要复杂。我仍然认为值得尝试找到它。
标签: java recursion matrix stack-overflow