如何获得二进制搜索的迭代次数?
这是我的代码:
int main()
{
int target = 11;
int N = 10;
std::vector<int> index;
int num;
for (int i = 0; i < N; i++) {
index.push_back(i);
}
int counter = 0;
unsigned int M, L = (unsigned int)-1, R = N;
M = (R - L) / 2; // Assume N is not zero
do {
int value;
M = M + L;
value = index[M];
if (value < target) L = M; else R = M;
M = (R - L) / 2;
counter++;
} while (M); // M is the size of the current interval
std::cout << R << '\n';
std::cout << "counter: " << counter << '\n';
system("pause");
return 0;
}
我想知道取决于
N
的迭代次数。我知道此算法的工作原理,但我需要迭代次数
用数学表示。
最佳答案
我将使用递归二进制搜索功能来递归递增。
在二进制检查的每个分支中,只需将其递增1,就可以递归计算迭代次数。
See live here
#include <iostream>
#include <vector>
std::size_t binarySearch(
const std::vector<int>& arr, // pass array as non-modifiyable(const ref)
std::size_t start, std::size_t end, // start and end indexes of the array
const int target) // target to find
{
if (arr.size() == 1) return arr[0] == target ? 1 : 0; // edge case
if (start <= end)
{
const std::size_t mid_index = start + ((end - start) / 2);
return arr[mid_index] == target ? 1 : // found the middle element
arr[mid_index] < target ?
binarySearch(arr, mid_index + 1, end, target) + 1: // target is greater than mid-element
binarySearch(arr, start, mid_index - 1, target) + 1; // target is less than mid-element
}
return 0;
}
int main()
{
int target = 11;
const int N = 10;
std::vector<int> index;
index.reserve(N); // reserve some memory
for (int i = 0; i < N; i++) {
index.push_back(i);
}
std::cout << "counter: " << binarySearch(index, 0, index.size() - 1, target) << std::endl;
return 0;
}
输出:
counter: 4