【问题标题】:Binary search recursive number of calls?二分查找递归调用次数?
【发布时间】:2023-04-06 16:04:01
【问题描述】:

所以我想知道,在我的书中,递归二分搜索是这样实现的:

 private static int bin(int[] arr, int low, int high, int target){
     counter++; //ignore this, it was to count how many calls this function invocated
     if(low > high) return -1;
     else{
         int mid = (low+high) / 2;
         if(target == arr[mid]) return mid;
         else if(target < arr[mid]) return bin(arr, low, mid-1, target);
         else return bin(arr, mid + 1, high, target);
     }

 }

它说“如果元素个数n是2的幂,将n表示为2的幂...情况3:键不在数组中,其值介于a[ 0] 和 a[n-1]。这里确定键不在数组中的比较次数等于指数。比最坏情况下的比较会少一次。"

但是当我坐下来使用数组 {1,2,3,4,5,6,7,9} 和键 8 找到函数调用的次数时,调用次数是 4。书上说COMPARISONS 的数量是 3(不包括我猜的第 3 行?),但我很确定函数调用的数量是 4。我还将它推广到二进制搜索的迭代实现,并推广了迭代或递归函数调用总是 floor(log base 2 ( n ) ) + 1。

能解释一下这里发生了什么吗?

【问题讨论】:

    标签: java search binary-search


    【解决方案1】:

    只进行了 3 次 target == arr[mid] 比较。在第四次迭代中,达到了基本情况if(low &gt; high),因此永远不会进行比较。正如您所说:“这里确定键不在数组中的比较次数等于指数。”您是正确的,因为我们没有处理第 3 行的比较语句。我们只关心目标值的比较语句。

    让我们看看迭代,直到达到 2 个基本案例中的任何一个。

    在数组{1,2,3,4,5,6,7,9}中对8进行二分搜索

    第一次迭代:

    low = 0
    high = 7
    mid = 3
    arr[mid] = 4
    (target == arr[mid]) == false
    

    第二次迭代:

    low = 4
    high = 7
    mid = 5
    arr[mid] = 6
    (target == arr[mid]) == false
    

    第三次迭代:

    low = 7
    high = 7
    mid = 7
    arr[mid] = 7
    (target == arr[mid]) == false
    

    第四次迭代:

    low = 8
    high = 7
    low > high == true
    

    此外,大 O 表示法是 O(log n)。 + 1 在大 O 中被认为是微不足道的,因此不计算在内。请参阅维基百科上的this list,了解 Big O 函数从最快到最慢的顺序。

    【讨论】:

    • 我现在明白了。谢谢!
    猜你喜欢
    • 2015-12-16
    • 2020-11-13
    • 2021-04-08
    • 1970-01-01
    • 2015-12-02
    • 2011-02-08
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多