Java 运行递归线性搜索时获取堆栈溢出错误
我意识到二进制搜索会更有效率,我甚至有一个可以工作,但我需要为实验室编写递归线性搜索。 我在方法linSearch上不断得到堆栈溢出,特别是在第33行 我需要搜索1280000大的数组Java 运行递归线性搜索时获取堆栈溢出错误,java,recursion,stack-overflow,linear-search,Java,Recursion,Stack Overflow,Linear Search,我意识到二进制搜索会更有效率,我甚至有一个可以工作,但我需要为实验室编写递归线性搜索。 我在方法linSearch上不断得到堆栈溢出,特别是在第33行 我需要搜索1280000大的数组 import java.util.Scanner; public class linSearch { public static void main(String[] args){ Scanner in = new Scanner(System.in); System.
import java.util.Scanner;
public class linSearch {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("enter size");
int size = in.nextInt();
System.out.println("enter numb");
double numb = in.nextDouble();
double [] array = new double[size];
for(int i = 0; i < 30; i++){
for(int j = 0; j < size-1; j++){
double random = (int)(Math.random() * 1000000);
array[j] = (double)(random / 100);
}
int position = linSearch(array, numb, 0);
if(position == -1){
System.out.println("the term was not found");
}
else{
System.out.println("the term was found");
}
}
}
public static int linSearch(double[] array, double key, int counter){
if(counter == array.length){
return -1;
}
if(array[counter] == key){
return counter;
}
else{
counter += 1;
return linSearch(array, key, counter); //error occurs here
}
}
}
如果堆栈能够容纳15000个对自身的交互调用,那么您就很幸运了,更不用说128000了 但是,如果您已经验证了递归的实现是正确的,那么您可以增加堆栈的大小,以便允许更多的调用。根据安装的Java虚拟机JVM,默认线程堆栈大小可能等于512KB或1MB 但是,可以使用-Xss标志增加线程堆栈大小。可以通过项目的配置或命令行指定此标志
希望这有帮助您的堆栈不够大,无法容纳1280000个堆栈帧。您需要编写算法的迭代版本或实现二进制搜索。二进制搜索只需要堆栈log21280000=20帧深。线性搜索对于递归解决方案来说是一个非常糟糕的候选者。如果需要处理像您所说的那么大的输入,那么您不太可能以这种方式编写工作程序。执行迭代线性搜索。谢谢你的回答,但问题是这个实验室需要递归线性搜索,我不能很好地解决这个问题,除了需要有序输入的二进制搜索。。。请注意,许多非更新递归算法(如搜索)可以稍微并行化。我假设在获得n帧深度后,它会变成非递归版本,在分而治之的方法中,我感觉这就是@axblount真正的意思。在x是可用处理器数量的情况下,您只能并行处理大约2x+1个任务,所以请深入到这个程度,或者直到有8个元素需要搜索。“哦,你可能也会发现打破主要方法是值得的。”发条工缪斯说,“我认为他应该使用悬挂的for循环。”。