java - 递增语句以跟踪递归方法中的比较

标签 java arrays recursion increment binary-search

我正在尝试构建一种递归二分搜索方法,该方法在可比较对象的排序数组中搜索感兴趣的对象。这是一个更大算法的一部分,该算法搜索已排序数组的集合并查找集合中所有数组共有的元素。目标是使算法的搜索/比较部分尽可能高效。线性解应该是可能的。方法是这样的:

private static boolean BinarySearch(Comparable[] ToSearch, Comparable ToFind, int first, int last){
    boolean found = false;
    int mid = first + (last - first) / 2;
    comparisons++;
    if(first > last){
        found = false;
    }
    else if(ToFind.compareTo(ToSearch[mid]) == 0){
        found = true;
        comparisons++;
    }
    else if(ToFind.compareTo(ToSearch[mid]) < 0) {
        found = BinarySearch(ToSearch, ToFind, first, mid - 1);
        comparisons++;
    }
    else{
        found = BinarySearch(ToSearch, ToFind,mid + 1, last);
        comparisons++;
    }
    return found;
}

我遇到的问题是通过递归跟踪比较的次数。因为我必须计算计算结果为 false 和 true 的比较,所以我尝试将比较递增语句放置在每个选择语句中,但这不起作用,因为如果语句计算结果为 false,则该语句不会递增。我也不能将它们放在选择语句之间,因为这会给我带来没有 if 错误的 else 。我想知道使用递归进行搜索是否是一个坏主意,但我想相信这是可能的。任何帮助将不胜感激。

最佳答案

也许您可以在每个 if block 中设置一个变量,其中包含到达该位置所需的比较次数,并将其添加到末尾?

private static boolean BinarySearch(Comparable[] ToSearch, Comparable ToFind, int first, int last){
    boolean found = false;
    int newComparisons = 0;
    int mid = first + (last - first) / 2;
    if(first > last){
        found = false;
        newComparisons = 1;
    }
    else if(ToFind.compareTo(ToSearch[mid]) == 0){
        found = true;
        newComparisons = 2;
    }
    else if(ToFind.compareTo(ToSearch[mid]) < 0) {
        found = BinarySearch(ToSearch, ToFind, first, mid - 1);
        newComparisons = 3;
    }
    else{
        found = BinarySearch(ToSearch, ToFind,mid + 1, last);
        newComparisons = 3;
    }
    comparisons += newComparisons;
    return found;
}

关于java - 递增语句以跟踪递归方法中的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549824/

相关文章:

php - 出现未知数组元素?

c++ - 没有参数的递归,也不是静态或全局变量

java - Bukkit - 如何在 60 秒后做一件确定的事情?

java - 查找 HashMap 值中的重复项

java - 使用相对路径添加 Android jar 文件

java - 处理/Java 在播放列表中播放 WAV

javascript - 如何根据三个键对数组对象进行分组

java - 将 Java 项目中的库/依赖项列入黑名单

c - 用C程序编写具有一定约束的GUESS游戏。发生的问题-代码错误,代码逻辑,建议

使用下一页 token 的 Pythonic 方式