二进制搜索的比较次数

时间:2014-05-05 02:08:42

标签: java search count binary

是否可以计算递归二分查找的比较次数?如果是这样,怎么样?

以下是我所指的搜索:

//binary search
public static int binarySearch(int[] items, int start, int end, int goal)
{
    if (start > end)
        return (-1);
    else
    {
        int mid = (start + end)/2;
        if (goal == items[mid])
            return (mid);
        else
        if (goal < items[mid])
            return (binarySearch(items, start, mid - 1, goal));
        else
            return (binarySearch(items, mid + 1, end, goal));
    }
}//end binarySearch

2 个答案:

答案 0 :(得分:1)

在方法之外声明你的count变量。然后每次调用方法时加1。

long count = 0;
//binary search
public static int binarySearch(int[] items, int start, int end, int goal)
{
    count += 1
    if (start > end)
        return (-1);
    else
    {
        int mid = (start + end)/2;
        if (goal == items[mid])
            return (mid);
        else
        if (goal < items[mid])
            return (binarySearch(items, start, mid - 1, goal));
        else
            return (binarySearch(items, mid + 1, end, goal));
     }
}//end binarySearch

答案 1 :(得分:0)

如果您希望调用者能够访问计数,那么您最有可能的方法是将累加器传入二进制搜索。在java 7或更低版​​本中,AtomicLong可能是一个不错的选择(虽然它确实有一些开销)。在java 8中,LongAdder也很好:

public static int binarySearch(int[] items, int start, int end, int goal, AtomicLong counter) {

}

每次进行比较时,只需增加计数:

counter.incrementAndGet()

退出搜索时,计数器将包含比较次数:

long count = counter.get()