运行递归线性搜索时出现堆栈溢出错误

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在生成字符串时出现堆栈溢出异常

从用户终端运行 Eclipse 时出现错误,但不是从 root 运行

基于堆栈的缓冲区溢出

递归 - 堆栈溢出错误

为啥增加递归深度会导致堆栈溢出错误?