递归线性搜索 - StackOverflowError

时间:2014-02-26 20:34:40

标签: java

我想知道是否有人可以指出我在这方面的正确方向,我觉得我忽略了一些非常简单的事情,主要是在一个约45,000字的列表上调用搜索方法,我相信这是问题,我的代码适用于列表中前6个或数千个单词的单词,但之后会遇到StackOverflow错误并崩溃。我有一个非递归的版本,工作正常。

我有两个基本情况,它们是数组的结尾,在这种情况下我们抛出ItemNotFoundException,如果找到了单词,在这种情况下我们返回项目所在的索引。

我目前的代码是:

public int search(String[] words, String wordToFind)
            throws ItemNotFoundException {
        return search(words, wordToFind, 0);
    }

    private int search(String[] words, String wordToFind, int index) {
        incrementCount();
        if(index == words.length) {
            // If index gets to the end of the array, then the word is not in the array
            throw new ItemNotFoundException();
        }
        if (words[index].equals(wordToFind)) {
            // If word is found, return the index.
            return index;
        } else {
            // Increment index by 1
            index++;
            // Call the search again
            return search(words, wordToFind, index);
        }
    }

非递归代码,运行正常:

    public int search(String[] words, String wordToFind)
        throws ItemNotFoundException {
    int count = 0;
    for (String word : words) {
        incrementCount();
        if (word.equals(wordToFind)) {
            return count;
        }
        count++;
    }
    throw new ItemNotFoundException();

}

2 个答案:

答案 0 :(得分:3)

  

主要是在大约45,000个单词的列表上调用搜索方法,我认为这是问题

是的,单词列表的长度很大 导致堆栈溢出 对于这么多单词来说这是正常的。

答案 1 :(得分:0)

您反复遇到堆栈溢出的原因是您要递归O(n)次,其中n是列表的大小。这意味着对于列表中的每个元素,您都要为程序堆栈分配一个必须保留的函数调用,直到找到结果为止。这自然会限制您可以搜索的列表的大小。

对于较大的列表,您需要更高效的递归解决方案,例如binary search