如何找到二进制搜索算法的迭代次数?

时间:2019-05-04 21:39:48

标签: c++ algorithm c++11 binary-search

如何获取二进制搜索的迭代次数?

这是我的代码:

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的迭代次数。 我知道此算法的工作原理,但我需要迭代次数 用数学表示。

3 个答案:

答案 0 :(得分:3)

我将通过使用递归二进制搜索功能来递归递增。 在二进制检查的每个分支中,只需增加一个,就可以递归计算迭代次数。

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

答案 1 :(得分:1)

在数学上,最大可能的迭代次数(假设仅整数类型的情况)为= ceil(log2(initial_r-initial_l))log的底数为2,因为每次我们通过取中点并切换到其中的一个来将范围减半时,一半。

答案 2 :(得分:0)

我也一直试图把对数概念化,这就是我试图理解答案的方式

来自https://en.wikipedia.org/wiki/Binary_search_algorithm

在数学中,二进制对数(log 2 n)是 必须将数字2增大才能获得值n。也就是说,对于任何 实数x,
x = log 2 n <=等效于=> 2 x = n

每个具有n个叶子的二叉树的高度至少为log 2 n,当n是2的幂且树是完整的二叉树时,其高度相等。

二分搜索有点像沿着二分搜索树,将节点减半,而该序列是对数(以2为底)序列 (我自己的理解,没有引用,可能是错误的)

然后从https://www.cct.lsu.edu/~sidhanti/tutorials/data_structures/page305.html

高度为h的完美二叉树正好为2 h + 1 -1 内部节点。相反,具有n的完美二叉树的高度 内部节点是log 2 (n + 1)。如果我们有搜索树 具有完美的二叉树的形状,然后每一个不成功 搜索访问恰好是h + 1个内部节点,其中 h = log 2 (n + 1)。

(再次跟进我自己的理解...)
因此,要到达节点N(每个二叉搜索树的N值是N?),在最坏的情况下,您需要进行log 2 (N + 1)次迭代(遍历树的多个层次)(发现仍然是一种可能性,因此是“最坏情况”的措辞。

在此处试运行(通过构建一个小的BST并手动计数):https://www.cs.usfca.edu/~galles/visualization/BST.html

(当然,在我试图合并各种资源以达成在这种情况下有意义的理论时,答案当然也适用于措词/计算的复核/确认/更正)