【问题标题】:Spell Checking With Recursive Binary Search - StackOverflow使用递归二进制搜索进行拼写检查 - Thinbug
【发布时间】:2015-02-12 17:18:40
【问题描述】:

我有这种递归二进制搜索拼写检查方法。 sArray 包含英格兰词典中的单词列表。关键是您可以发送的任何单词。该方法将获取任何单词(键)并使用递归二进制搜索在字典(sArray)中查找它。

我不确定我的递归步骤是否正确,我从中间加/减 1 以获得新的高/低指数。但是,当我运行程序时,我得到一个堆栈溢出错误,这表明我的递归没有停止。下面是错误。

Exception in thread "main" java.lang.StackOverflowError
at java.lang.String$CaseInsensitiveComparator.compare(String.java:1173)
at java.lang.String.compareToIgnoreCase(String.java:1226)
at Program2.bSearch(Program2.java:111)
at Program2.bSearch(Program2.java:121)

public int bSearch(ArrayList<String> sArray, String key, int lowIndex, int highIndex) {

    if (lowIndex > highIndex) {
        System.out.println("The word was not found " + c);

        c++;
        incorrectWords++;
        return -1;
    }

    mid = (lowIndex + highIndex) / 2;

    if (sArray.get(mid).compareToIgnoreCase(key)==0) {
        correctWords++;
        System.out.println("The word " + sArray.get(mid) + " was found *");
        return mid;
    } else if (sArray.get(mid).compareTo(key) > 0) {

        return bSearch(sArray, key, lowIndex, mid + 1);

    } else {

        return bSearch(sArray, key, mid - 1, highIndex);
    }
}

【问题讨论】:

  • String.compareTo 将在您的搜索中失败,如果您有大写和非大写单词的组合

标签: java recursion stack-overflow binary-search


【解决方案1】:
} else if (sArray.get(mid).compareTo(key) > 0) {

    return bSearch(sArray, key, lowIndex, mid + 1);

} else {

    return bSearch(sArray, key, mid - 1, highIndex);
}

找不到密钥时会卡住。应该是

} else if (sArray.get(mid).compareTo(key) > 0) {
    return bSearch(sArray, key, lowIndex, mid - 1);
} else {
    return bSearch(sArray, key, mid + 1, highIndex);
}

注意+1-1。要搜索的范围应该是单调递减的。

【讨论】:

    【解决方案2】:

    当你调用 bSearch 函数时使用

    return bSearch(sArray, key, lowIndex, mid - 1);
    

    return bSearch(sArray, key, mid+1, highIndex);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2016-01-22
      • 2015-01-21
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多