运行递归线性搜索时出现堆栈溢出错误
Posted
技术标签:
【中文标题】运行递归线性搜索时出现堆栈溢出错误【英文标题】:Getting stack overflow error when running recursive linear search 【发布时间】:2015-03-30 02:49:00 【问题描述】:我意识到二进制搜索会更有效,我什至有一个工作,但我需要为实验室编写递归线性搜索。
我一直在方法 linSearch()
上遇到堆栈溢出,特别是在第 33 行。
我需要搜索最大为 1,280,000 的数组。
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
【问题讨论】:
您的堆栈不够大,无法容纳 1,280,000 个堆栈帧。您需要编写算法的迭代版本或实现二进制搜索。二进制搜索只需要堆栈 log2(1280000) = 20 帧深。 线性搜索不适合递归解决方案。如果它需要处理像您所说的那样大的输入,您不太可能以这种方式编写工作程序。改为执行迭代线性搜索。 感谢您的回复,但问题是这个实验室需要递归线性搜索,我无法解决这个问题 好吧,除了需要有序输入的二进制搜索...请注意,许多非更新递归算法(例如搜索)可以稍微并行化。我会假设在获得n
的帧数之后,它会以分而治之的方式变为非递归版本(我感觉这就是@axblount 的真正意思)。您只能并行化大约2x + 1
任务(其中x
是可用处理器的数量),所以要深入,或者直到有8 个元素要搜索。哦,你可能会发现把 main 方法分解一下也是值得的。
@Clockwork-Muse 我认为他应该只使用一个危险的 for 循环。
【参考方案1】:
如果你的堆栈可以容纳 15000 个对自身的交互调用,那你就很幸运了,更不用说 128,000 个 但是,如果您已验证递归已正确实现,则可以增加堆栈的大小,以允许更多的调用。根据安装的 Java 虚拟机 (JVM),默认线程堆栈大小可能等于 512KB 或 1MB。
但是,您可以使用 -Xss 标志增加线程堆栈大小。可以通过项目的配置或命令行指定此标志。
Click & Follow Guide Here
希望对你有帮助
【讨论】:
以上是关于运行递归线性搜索时出现堆栈溢出错误的主要内容,如果未能解决你的问题,请参考以下文章
Expecto FsCheck在生成字符串时出现堆栈溢出异常