Java 为整数的平方根编写程序时出现堆 Space 错误
Java Heap Space error while writing a program for Square root of an Integer
我试图找出一个整数的平方根,但万一整数值太大,例如 - 2147395599。然后下面的程序给出了这个异常。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.aakash.BinarySearch.SquareRoot.mySqrt(SquareRoot.java:12)
at com.aakash.BinarySearch.SquareRoot.main(SquareRoot.java:8)
Process finished with exit code 1
平方根程序
package com.aakash.BinarySearch;
import java.util.Arrays;
public class SquareRoot {
public static void main(String[] args) {
int ans = mySqrt(2147395599);
System.out.println(ans);
}
public static int mySqrt(int x) {
int[] arrayUpton = new int[x];
int start =0;
int end = arrayUpton.length-1;
int mid = start + (start-end)/2;
for (int index = start; index <= end; index++) {
arrayUpton[index]=index+1;
}
for (int index = start; index < end; index++) {
if(arrayUpton[index]*arrayUpton[index]==x){
return arrayUpton[index];
} else if (arrayUpton[index]*arrayUpton[index]>x) {
return arrayUpton[index-1];
}
}
return 0;
}
}
您正试图分配一个包含近 2^31 个整数的数组。这将占用 8GB,这(显然)对于您的 JVM 堆来说太大了。 (而且它可能对您的计算机来说太大了。)
但你真正的问题是你的算法。
您不需要分配一个巨大的数组来计算整数平方根。即使您通过搜索所有(正)int
值来做到这一点。
考虑一下:您的代码小心地将每个数组元素设置为比数组下标大 1 的数字。然后它从数组中检索值以使用它们。但是,如果您知道 arrayUpton[i]
包含 i + 1
...,则无需检索它。只需将 1
添加到 i
而不是从数组中获取(相同的)值。
另外:
- 不管标签如何,您的算法都没有实现二进制搜索。
- 我什至不相信该算法会起作用。
我建议你谷歌一下,看看能不能找到更好的整数平方根算法。
我试图找出一个整数的平方根,但万一整数值太大,例如 - 2147395599。然后下面的程序给出了这个异常。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.aakash.BinarySearch.SquareRoot.mySqrt(SquareRoot.java:12)
at com.aakash.BinarySearch.SquareRoot.main(SquareRoot.java:8)
Process finished with exit code 1
平方根程序
package com.aakash.BinarySearch;
import java.util.Arrays;
public class SquareRoot {
public static void main(String[] args) {
int ans = mySqrt(2147395599);
System.out.println(ans);
}
public static int mySqrt(int x) {
int[] arrayUpton = new int[x];
int start =0;
int end = arrayUpton.length-1;
int mid = start + (start-end)/2;
for (int index = start; index <= end; index++) {
arrayUpton[index]=index+1;
}
for (int index = start; index < end; index++) {
if(arrayUpton[index]*arrayUpton[index]==x){
return arrayUpton[index];
} else if (arrayUpton[index]*arrayUpton[index]>x) {
return arrayUpton[index-1];
}
}
return 0;
}
}
您正试图分配一个包含近 2^31 个整数的数组。这将占用 8GB,这(显然)对于您的 JVM 堆来说太大了。 (而且它可能对您的计算机来说太大了。)
但你真正的问题是你的算法。
您不需要分配一个巨大的数组来计算整数平方根。即使您通过搜索所有(正)int
值来做到这一点。
考虑一下:您的代码小心地将每个数组元素设置为比数组下标大 1 的数字。然后它从数组中检索值以使用它们。但是,如果您知道 arrayUpton[i]
包含 i + 1
...,则无需检索它。只需将 1
添加到 i
而不是从数组中获取(相同的)值。
另外:
- 不管标签如何,您的算法都没有实现二进制搜索。
- 我什至不相信该算法会起作用。
我建议你谷歌一下,看看能不能找到更好的整数平方根算法。