java - java中的内存错误

标签 java

我正在尝试使用 Java 素数算法进行编码。我试图面对整数和长尺寸的问题。我的简单代码如下,直到达到 n 的限制为止:

public static long f(int n) {
  if (n == 1 || n == 2) 
    return 1;
  else { 
    long value = f(n-2) + f(n-1); 
    return value;
  }
}

如果在我的 main 中我给 50 例如我的代码将被压碎,我猜测是由于结果的大小。我还有另一种我很难理解的方法,如下所示:

private static long[] cache = new long[60]; 

public static long f(int n) {
  if (n == 1 || n == 2) 
    return 1;
  else if (cache[n] > 0) 
    return cache[n]; 
  else { 
    long value = f(n-2) + f(n-1); 
    cache[n] = value; 
    return value;
  }
}

通过这种方法,无论 n 是什么,一切都正常,我的问题是我无法区分。

最佳答案

“粉碎”是指计算运行时间很长。原因是多次调用相同的调用。如果将此添加到您的方法中:

static long count;
public static long f(int n) {
    count++;
    ...

您将看到该方法执行了多少次。对于 f(50),它实际上调用了方法 25,172,538,049 次,它在我的机器上运行了 41 秒。

当您缓存先前调用的结果时,称为 memoization ,您消除了所有冗余调用,例如f(40) = f(39) + f(38),但是 f(39) = f(38) + f(37),所以 f (38) 被调用了两次。记住 f(38) 的结果意味着后续调用会立即得到答案,而无需重做递归。

没有内存,我得到这个:

 n           f(n)           count       time(ns)
== ============== =============== ==============
 1              1               1          6,273
 2              1               1            571
 3              2               3            855
 4              3               5          1,141
 5              5               9          1,425
 6              8              15          1,140
 7             13              25          1,996
 8             21              41          2,851
 9             34              67          7,413
10             55             109         16,536
11             89             177          8,839
12            144             287         19,103
13            233             465         21,098
14            377             753         11,405
15            610           1,219          5,703
16            987           1,973          9,979
17          1,597           3,193         21,099
18          2,584           5,167         32,788
19          4,181           8,361         35,639
20          6,765          13,529         57,307
21         10,946          21,891         91,521
22         17,711          35,421        147,687
23         28,657          57,313        237,496
24         46,368          92,735        283,970
25         75,025         150,049        331,583
26        121,393         242,785        401,720
27        196,418         392,835        650,052
28        317,811         635,621      1,053,483
29        514,229       1,028,457      1,702,679
30        832,040       1,664,079      2,750,745
31      1,346,269       2,692,537      4,455,137
32      2,178,309       4,356,617     12,706,520
33      3,524,578       7,049,155     11,714,051
34      5,702,887      11,405,773     19,571,980
35      9,227,465      18,454,929     30,605,757
36     14,930,352      29,860,703     51,298,507
37     24,157,817      48,315,633     84,473,965
38     39,088,169      78,176,337    127,818,746
39     63,245,986     126,491,971    208,727,118
40    102,334,155     204,668,309    336,785,071
41    165,580,141     331,160,281    543,006,638
42    267,914,296     535,828,591    875,782,771
43    433,494,437     866,988,873  1,429,555,753
44    701,408,733   1,402,817,465  2,301,577,345
45  1,134,903,170   2,269,806,339  3,724,691,882
46  1,836,311,903   3,672,623,805  6,010,675,962
47  2,971,215,073   5,942,430,145  9,706,561,705
48  4,807,526,976   9,615,053,951 15,715,064,841
49  7,778,742,049  15,557,484,097 25,427,015,418
50 12,586,269,025  25,172,538,049 41,126,559,697

关于java - java中的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957290/

相关文章:

java - @ApiMethod 的复杂路径路由

java - 系统属性的 Spring @value 给出 null

java - 动态注入(inject)spring bean

Java 市场份额 : what version of Java runtime do most people have? 我是否需要使用 Flash 才能获得 90% 的市场份额?

java - 运行时错误: running java class file

java - 具有多个参数的 K-means 算法

java - 解析服务器: Remove old profile image associated with a user

java - 堆叠几个 ASM 字节码访问者的简单方法?

java - Sonar-runner执行失败导致cast异常

java - 如何在不引起重复的情况下查找和替换