Получение ошибки переполнения стека при запуске рекурсивного линейного поиска

Я понимаю, что бинарный поиск был бы намного эффективнее, и у меня даже есть один работающий, но мне нужно написать рекурсивный линейный поиск для лаборатории. я продолжаю получать переполнение стека в методе 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
        }
    }
}

person Zeke    schedule 30.03.2015    source источник
comment
Ваш стек недостаточно велик, чтобы вместить 1 280 000 кадров стека. Вам нужно написать итеративную версию алгоритма или реализовать бинарный поиск. Для бинарного поиска потребуется только стек log2 (1280000) = 20 кадров в глубину.   -  person axblount    schedule 30.03.2015
comment
Линейный поиск — очень плохой кандидат на рекурсивное решение. Вы вряд ли сможете написать работающую программу таким образом, если ей нужно обрабатывать входные данные такого размера, как вы говорите. Вместо этого выполните итеративный линейный поиск.   -  person John Bollinger    schedule 30.03.2015
comment
спасибо за ваши ответы, но дело в том, что эта лаборатория требует рекурсивного линейного поиска, я не могу обойти это   -  person Zeke    schedule 30.03.2015
comment
Ну, помимо бинарного поиска, требующего упорядоченных входных данных... обратите внимание, что многие рекурсивные алгоритмы без обновления (такие как поиск) могут быть несколько тривиально распараллелены. Я бы предположил, что после получения n количества кадров в глубину он изменится на нерекурсивную версию в подходе «разделяй и властвуй» (у меня такое чувство, что @axblount действительно имел в виду это). Вы можете распараллелить только около 2x + 1 задач (где x — количество доступных процессоров), так что углубляйтесь или пока не будет 8 элементов для поиска. О, возможно, вам стоит немного разбить основной метод.   -  person Clockwork-Muse    schedule 30.03.2015
comment
@Clockwork-Muse Я думаю, ему следует просто использовать опасный цикл for.   -  person axblount    schedule 30.03.2015


Ответы (1)


Вам повезет, если ваш стек сможет вместить 15 000 интерактивных вызовов, не говоря уже о 128 000. Однако, если вы убедились, что рекурсия реализована правильно, вы можете увеличить размер стека, чтобы разрешить большее количество вызовов. В зависимости от установленной виртуальной машины Java (JVM) размер стека потока по умолчанию может быть равен 512 КБ или 1 МБ.

Однако вы можете увеличить размер стека потоков, используя флаг -Xss. Этот флаг можно указать либо через конфигурацию проекта, либо через командную строку.

Нажмите и следуйте инструкциям здесь

Надеюсь это поможет

person Brendy Donnelly    schedule 30.03.2015