程序效率和java.lang.OutOfMemoryError:java堆空间
问题是每2个元素都要移除,直到最后一个元素保留。(假设图元放置在圆中) 我的程序可以很好地处理较小的n值,但当我使用较大的值时,它会给我一条程序效率和java.lang.OutOfMemoryError:java堆空间,java,memory,heap,space,out,Java,Memory,Heap,Space,Out,问题是每2个元素都要移除,直到最后一个元素保留。(假设图元放置在圆中) 我的程序可以很好地处理较小的n值,但当我使用较大的值时,它会给我一条java.lang.OutOfMemoryError:java堆空间消息 我需要做些什么才能使我的代码更有效率并解决这个错误 谢谢大家! import java.util.*; public class ArrayLists { public static void main(String[] args) { ArrayList m
java.lang.OutOfMemoryError:java堆空间
消息
我需要做些什么才能使我的代码更有效率并解决这个错误
谢谢大家!
import java.util.*;
public class ArrayLists {
public static void main(String[] args) {
ArrayList myList = new ArrayList();
int n = 23987443;
for (int i = 1; i <= n; i = i + 2) {
myList.add("" + i);
}
Object x = myList.get(myList.size() - 1);
Object y = myList.get(myList.size() - 1);
while (myList.size() != 1) {
if (x == y) {
for (int i = 0; i <= myList.size() - 1; i++) {
myList.remove(i);
}
}
else {
x = y;
for (int i = 1; i <= myList.size() - 1; i++) {
myList.remove(i);
}
}
y = myList.get(myList.size() - 1);
}
System.out.println("Winner:" + myList);
}
}
import java.util.*;
公共类数组列表{
公共静态void main(字符串[]args){
ArrayList myList=新的ArrayList();
int n=23987443;
对于(int i=1;i您正在构建一个庞大的字符串列表。因此,您需要足够的内存来保存所有列表。您可以使用适当的大小初始化列表,避免临时复制以放大列表,从而减少消耗:
int n = 23987443;
List<String> myList = new ArrayList<String>(23987443);
例如(1024 MB的堆)您正在构建一个庞大的字符串列表。因此,您需要足够的内存来保存所有列表。您可以通过使用适当的大小初始化列表,避免使用临时副本来扩大列表,从而减少消耗:
int n = 23987443;
List<String> myList = new ArrayList<String>(23987443);
例如(1024MB的堆)这使用更少的内存,但速度要快一些,因为它是O(N*logn)
而不是O(N^2*logn)
publicstaticvoidmain(字符串[]args){
//对于(int n=1;n<400;n++){
int n=23987443;
系统输出打印(n+“:”);
结果(n);
// }
}
私有静态无效结果(int n){
List myList=new ArrayList(),myList2=new ArrayList();
对于(inti=1;i这使用更少的内存,但引用速度更快,因为它是O(N*logn)
而不是O(N^2*logn)
publicstaticvoidmain(字符串[]args){
//对于(int n=1;n<400;n++){
int n=23987443;
系统输出打印(n+“:”);
结果(n);
// }
}
私有静态无效结果(int n){
List myList=new ArrayList(),myList2=new ArrayList();
对于(int i=1;i问题的答案可以用封闭形式计算,如果您将列表中的元素数写为:
n=2^m+l
其中m是2的最大幂,因此可以用封闭形式计算问题的答案,因为如果将列表中的元素数写为:
n=2^m+l
其中m是2的最大幂,因此2^m你确定这个问题陈述是完整的“问题是删除第二个元素,直到最后一个元素保留。”?这与问题的答案无关,但当你知道列表包含字符串时,为什么要使用x和y作为对象?最明显的是不要使用字符串(将“+i
更改为i
)但除此之外,这到底是在做什么?!你能说出你的程序在做什么吗?我怀疑用另一种方法做会更有效。你确定这个问题陈述是完整的吗“问题是删除第二个元素,直到最后一个元素保留。”?这与问题的答案无关,但当您知道列表包含字符串时,为什么要使用x和y作为对象?最明显的是不要使用字符串(将“”+i
更改为i
)但除此之外,这到底是在做什么?!你能说出你的程序在做什么吗?我怀疑用另一种方式做会更有效率。我在我的程序中如何使用java-Xmx1024m以及我在哪里使用它(确切的语句)。了解它的任何链接都会非常感谢答案中的示例。-Xmx是一个JVM选项,在启动程序时传递给java可执行文件:java-Xmx1024m-cp myjar.jar com.foo.bar.MyMainClass
。谢谢。我想知道我是否可以直接在程序中而不是在命令中更改堆大小哦,我明白了。谢谢你的帮助和分享你的知识:)我是如何在我的程序中使用java-Xmx1024m的,我在哪里使用它(以及确切的声明)。了解它的任何链接都会非常感谢答案中的示例。-Xmx是一个JVM选项,在启动程序时传递给java可执行文件:java-Xmx1024m-cp myjar.jar com.foo.bar.MyMainClass
。谢谢。我想知道我是否可以直接在程序中而不是在命令中更改堆大小ne.哦,我明白了。谢谢你的帮助和分享你的知识:)有趣的是,当我将x和y作为int使用时,你将其指定为int,这是在抛出错误,告诉我“预期对象”你能解释一下原因和方法吗?感谢你在我将x和y作为int使用时,将其指定为int,这是在抛出错误,告诉我“预期对象”你能给我解释一下原因和方法吗?谢谢,答案完全正确!如果有更多像这样的链接,我可以用更数学的方式找到解决问题的方法,我将不胜感激。谢谢!但是我无法掌握逻辑,如果你能解释它与我的问题相关的话,那将非常有帮助。再次感谢。我想我有partially理解:Dell,我说我记得读过它,不是我自己理解的:),但是,对我来说,从n=1开始写例子总是有帮助的,类似于第10页书中所做的,猜测一个符合结果的封闭形式(例如(1.9))。还有用来建立循环的圆图(1.8)是非常有用的。证明封闭形式是用归纳法完成的,表明它与递归相同……我还可以推荐Udi Manber的《算法简介》一书,其中归纳法证明是一种设计程序的方法。谢谢分享Gregor Ophey:)愿你拥有更多的知识:D并继续分享:)答案是完全正确的!任何像这样的链接,在那里我可以找到一个更数学的方法,将非常感谢。谢谢!但是我无法掌握答案
public static void main(String[] args) {
// for (int n = 1; n < 400; n++) {
int n = 23987443;
System.out.print(n + ": ");
result(n);
// }
}
private static void result(int n) {
List<Integer> myList = new ArrayList<>(), myList2 = new ArrayList<>();
for (int i = 1; i <= n; i = i + 2) {
myList.add(i);
}
Integer x = myList.get(myList.size() - 1);
Integer y = myList.get(myList.size() - 1);
while (myList.size() != 1) {
if (x == y) {
for (int i = 1; i < myList.size(); i += 2) {
myList2.add(myList.get(i));
}
} else {
x = y;
for (int i = 0; i <= myList.size() - 1; i += 2) {
myList2.add(myList.get(i));
}
}
List<Integer> tmp = myList2;
myList2 = myList;
myList = tmp;
myList2.clear();
y = myList.get(myList.size() - 1);
// System.out.println("\t" + myList);
}
System.out.println("Winner:" + myList.get(0));
}
public class ArrayLists {
public static void main(String[] args) {
int n = 23987443;
int pow = Integer.highestOneBit(n);
int l = n - pow;
System.out.println("Winner:[" +((2*l)+1)+"]" );
}
}
Winner:[14420455]