- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我想知道,在我的书中,递归二分搜索的实现如下:
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。书上说比较的次数是 3(不包括我猜的第三行?),但我很确定函数调用的次数是 4。我还将其推广到二分搜索的迭代实现,并推广了迭代次数或递归函数调用次数始终为 Floor(log base 2 ( n ) ) + 1。
能解释一下这是怎么回事吗?
最佳答案
仅 3 target == arr[mid]
进行比较。在第四次迭代中,基本情况 if(low > high)
已达到,因此从不进行比较。正如您所说:“这里确定键不在数组中的比较次数等于指数。”你是对的,我们不处理第 3 行的比较语句。我们只关心目标值的比较语句。
让我们看看迭代,直到达到 2 个基本情况中的任何一个。
二分搜索8
在数组 {1,2,3,4,5,6,7,9}
第一次迭代:
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 在 Big O 中被认为是微不足道的,因此不被计算在内。请参阅this list在 Wikipedia 上了解 Big O 函数从最快到最慢的顺序。
关于java - 二分查找递归调用次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50226434/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!