在 C++ 中进行二进制搜索的更有效方法?

More efficient way to do binary search in c++?

我正在做一个关于使用 C++ 进行二进制搜索的问题,但我想知道是否有更有效的方法来实现它。

我的代码如下:

int binarySearch(int arr[], int l, int r, int x) {
    if (r >= l) {
        int mid = l + (r - l) / 2;
 
        if (arr[mid] == x) {
            return mid;
        } else if (arr[mid] > x) {
            return binarySearch(arr, l, mid - 1, x);
        } else {
            return binarySearch(arr, mid + 1, r, x);
        }
    } else {
        return -1;
    }
}

二分搜索是一种非常有效的方法,可以在我们的数组中搜索任何特定值。尤其是在非常长的数组中,传统的线性搜索方法会消耗大量编译时间。谈论时间复杂度 => 线性搜索 O(n) 而二分搜索具有时间复杂度:O(log2n) {log n with base 2}

所以这个二进制搜索代码不需要其他优化,但是是的.. 您可以了解 TERNARY SEARCH 而不是二进制搜索,它并不比二进制搜索快,但是适合学习新事物... https://www.geeksforgeeks.org/ternary-search/

Ternary Search 和Binary Search 一样,但是这里把数组分成3 部分然后我们进行比较。 Ternary Searcg 的时间复杂度也是 O(log3n) :log n with base 3

我是二分查找的支持者没有相等性比较,所以每个缩减步骤都进行一次比较(你最后执行一次相等性比较,当间隔缩小了)。

相等比较的思想是当找到键时可以提前终止搜索。如果在深度 d 处找到密钥,则需要进行 2d 次比较。平均比较次数是树的平均深度的两倍,对于完美树来说是 2 Log2(N) - 1(提前终止只保留一次比较)。

这将在不进行相等性测试的情况下与 Log2(N) 进行比较。还不算找不到钥匙时,总是遍历树的完整深度!测试平等似乎是一个错误的好主意。