Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您好,我得到了java.lang.OutOfMemoryError:java堆空间在试图解决这个算法问题时,可以做什么?_Java_Algorithm_Knapsack Problem - Fatal编程技术网

您好,我得到了java.lang.OutOfMemoryError:java堆空间在试图解决这个算法问题时,可以做什么?

您好,我得到了java.lang.OutOfMemoryError:java堆空间在试图解决这个算法问题时,可以做什么?,java,algorithm,knapsack-problem,Java,Algorithm,Knapsack Problem,这个问题类似于子集和,在子集和中,我们确定一个数字列表是否有一个产生给定和的子集,但在这种情况下,我们只允许从列表p的元素创建一个子集,只要它等于或大于其他列表q中的相应元素。另外,k不是元素值的总和,而是可以添加的元素数。 所以,如果k是3,我们需要从列表p中选择3个元素,但这些元素不能小于列表q的相应元素。 我不熟悉动态规划和背包,请帮助我。 公共静态列表kthPerson(int k、List p、List q){ 列表q1=新的ArrayList(); q1.addAll(q); 集合。

这个问题类似于子集和,在子集和中,我们确定一个数字列表是否有一个产生给定和的子集,但在这种情况下,我们只允许从列表p的元素创建一个子集,只要它等于或大于其他列表q中的相应元素。另外,k不是元素值的总和,而是可以添加的元素数。 所以,如果k是3,我们需要从列表p中选择3个元素,但这些元素不能小于列表q的相应元素。 我不熟悉动态规划和背包,请帮助我。

公共静态列表kthPerson(int k、List p、List q){
列表q1=新的ArrayList();
q1.addAll(q);
集合。排序(q1);
int maxQ=q1.get(q1.size()-1);
List res=new ArrayList();
int[][]dp=新int[k+1][maxQ+1];
对于(int[]d:dp){
数组。填充(d,0);
}
对于(int u=0;u=u){
dp[count][u]=i+1;
计数++;
}
如果(计数=k){
打破
}
}
}
对于(int s=0;s
事实上,这个问题不需要动态编程。没有一个案例实际上是基于以前的案例。
因此,您可以编写此函数:

公共静态列表kthPersonNew(int k、List p、List q){
List res=new ArrayList();
对于(整数限制:q){
整数计数=0;
布尔加法=假;
//每人指数
对于(int i=0;i=极限){
计数++;
//如果您计算了k人,则将第k人添加到res和break中
如果(计数=k){
决议添加(i+1);
添加=真;
打破
}
}
}
//如果没有添加任何人,则添加0
如果(!已添加){
决议添加(0);
}
}
返回res;
}
它为您提供的测试用例提供相同的输出

p=[1,4,4,3,1,2,6]
q=[1,2,3,4,5,6,7]
=>
res=[2,3,3,0,0,0]

现在我确信这个程序不会导致
java.lang.OutOfMemoryError
,因为您只使用了一个数组,它的长度与
q
相同
这应该能解决你的问题


编辑:
新算法在内存方面似乎很好,但速度不够快,假设
q
一直在增长,我们可以使用它,并确保时间复杂度始终小于
O(q*k+n)
。因为每个不符合当前限制的元素都不会符合未来的限制

我们需要一个助手类:

类元素{
私有整数索引;
私有int值;
公共元素(int索引,int值){
这个指数=指数;
这个值=值;
}
public int getIndex(){
返回此.index;
}
public int getValue(){
返回此.value;
}
@凌驾
公共字符串toString(){
返回值+“”+索引;
}
公开作废印刷品(){
System.out.println(本文件);
}
}
这样,即使在删除变量后,我们也能记住旧的变量索引

以及新功能:

公共静态列表kthPersonFast(int k、List p、List q){
List res=new ArrayList();
列表元素=新的LinkedList();
对于(int i=0;i=限制){
计数++;
//如果您计算了k人,则将第k人添加到res和break中
如果(计数=k){
res.add(person.getIndex()+1);
添加=真;
打破
}
}否则{
//如果该人不符合该限制,则不符合任何其他限制
//因为我们假设极限总是在增长
itr.remove();
}
}
//如果没有添加任何人,则添加0
如果(!已添加){
决议添加(0);
}
}
返回res;
}
您还需要导入:

import java.util.Iterator;
导入java.util.LinkedList;
应该是这样


祝您好运

您可能需要查看程序的其他部分,看看是否可以删除未使用的对象。在这种情况下,我们需要看到更多的代码。也就是说,如果您尚未尝试,您可能会从以下方面受益:

如果您使用的是64位JVM,只需增加堆大小即可

java -Xmx4G -jar MyProgram.jar

您必须向我们提供更多信息和解释