gpt4 book ai didi

java - 大输入的运行时错误

转载 作者:行者123 更新时间:2023-12-02 06:21:18 25 4
gpt4 key购买 nike

我正在执行相同的任务。我正在粘贴我的代码。当我尝试运行像 10 亿这样的大输入(即 k=10^9)时,它显示运行时错误。你能帮我解决这个问题吗?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Hashtable;
import java.util.StringTokenizer;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static Long counter = (long)0;
public static void main (String[] args) throws java.lang.Exception
{
BufferedReader ob1= new BufferedReader(new InputStreamReader(System.in));
int user_choice= Integer.parseInt(ob1.readLine());

int flag=0;
while(user_choice!=0)
{
user_choice--;
StringTokenizer obj;
Long n,k;
obj=new StringTokenizer(ob1.readLine());
n=Long.parseLong(obj.nextToken());
k=Long.parseLong(obj.nextToken());
Hashtable<Long, Long> hash= new Hashtable<Long, Long>();
while(n!=0)
{
StringTokenizer obj1;
Long start,comp;
Long finish;
obj1=new StringTokenizer(ob1.readLine());
start=Long.parseLong(obj1.nextToken());
finish=Long.parseLong(obj1.nextToken());
comp=Long.parseLong(obj1.nextToken());
if(flag==0)
{
for(int i=1;i<=k;i++)
{
hash.put((long)i,(long)0);
}

}
Long finish1;
finish1=hash.get(comp);
if(finish1==0)
{
hash.put(comp,finish);
counter++;
}
else if(finish1<=start)
{
counter++;
hash.put(comp,finish);
}
n--;
flag=1;
}
flag=0;
System.out.println(counter);
counter=(long)0;
/* for(int i=1;i<=k;i++)
System.out.println(hash.get((long)i) +" "+i );*/

}
}
}

输入:

2
3 300000
1 3 1
4 6 2
7 10 3
3 10000000
1 3 1
4 6 2
7 10 3

输出:

Runtime error   time: 0.09 memory: 380160 signal:-1

3

最佳答案

这是捕获错误的 Ideone 源代码:http://ideone.com/w2Ub6Y

我这样做的不仅仅是抛出异常:

System.out.println(Runtime.getRuntime().freeMemory() / 1000000.0 + "MB free");

try {

// the whole program

} catch(Throwable t) {
System.out.println(t.getClass().getName() + " " + t.getMessage());
System.out.println();
for(StackTraceElement elem : t.getStackTrace()) {
System.out.println(elem);
}
}

这确实是一个 OutOfMemoryError。输出为:

15.87436MB free3java.lang.OutOfMemoryError Java heap spacejava.util.Hashtable.rehash(Hashtable.java:496)java.util.Hashtable.put(Hashtable.java:560)Ideone.main(Main.java:42)

Line 42 is hash.put:

hash.put((long)i,(long)0);

根据我的经验,~16MB 似乎是常见的“默认”堆大小。我很惊讶 Ideone 没有让它变小。如果您想让 Hashtable 更大,您需要在 native IDE 上运行它,并且 increase the heap 。如果需要,您可以手动将堆设置得很大。

Java 堆应该根据需要自动增长,但是:

  • A)Ideone 会很聪明地禁用它,并且看起来您正在使用 Ideone(根据代码的模板外观判断)并且
  • B) 如果堆增长太快,您仍然可能会遇到 OutOfMemoryError。

关于java - 大输入的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com