【问题标题】:More efficient way to do binary search in c++?在 C++ 中进行二进制搜索的更有效方法?
【发布时间】:2022-01-14 13:53:23
【问题描述】:

我正在做一个关于使用 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;
    }
}

【问题讨论】:

标签: c++ performance binary-search


【解决方案1】:

我是二分查找的支持者比较相等,因此每个归约步骤都进行一次比较(当间隔缩小时,最后执行一次相等比较)。

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

这将与没有相等测试的 Log2(N) 进行比较。不算,当没有找到密钥时,总是遍历树的全部深度!测试相等性似乎是一个错误的好主意。

【讨论】:

    【解决方案2】:

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

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

    三元查找和二分查找一样,但是在这个过程中,数组被分成了 3 个部分,然后我们进行比较。三元搜索的时间复杂度也是 O(log3n) :log n with base 3

    【讨论】:

    • 三元搜索用于查找单峰函数的最大值(或最小值)。使用三元搜索在已排序的数组中查找值不是一个好主意——二分搜索更好。
    • 这是一个错误的好主意,三元搜索速度较慢。因为您确实需要 Log3 缩减步骤而不是 Log2,但每一步都需要进行 1 或 2 次比较而不是 1,例如平均 1.5。 [我假设一个没有比较相等性的算法。] 那么,1.5/Ln(3) > 1。顺便说一下,按照这个逻辑,K-ary search 会更好,具有 LogK 性能,K 与你想要的。
    • 这是为什么大 O 表示法适用的完美示例:您声称 O(Log3(N)) 优于 O(Log2(N))。但是在大 O 表示法中,两者是相同的,并且只是写成 O(Log(N)):这是非常不确定的。当你检查它时,隐藏的渐近常数有利于二进制搜索。
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2021-04-15
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多