递增语句以跟踪递归方法

时间:2017-10-03 17:03:37

标签: 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,则语句不会递增。我也不能把它们放在选择语句之间,因为如果错误的话,这会让我没有。我想知道在搜索中使用递归是否是一个坏主意,但我想相信它是可能的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

也许您可以在每个if块中设置一个变量,其中包含到达那里的比较次数,并在最后添加它?

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;
}