服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c++与python实现二分查找的原理及实现

c++与python实现二分查找的原理及实现

2022-10-17 13:21机器学习入坑者 C/C++

本文介绍了c++与python实现二分查找的原理及实现,二分查找指首先将数组中间值和目标值进行比较,如果相等则返回;如果不相等,则选择中间值左边的一半或者右边的一半进行比较;不断重复直到检索完毕,下文相关资料需要的

在计算机中,数据的查找方式与其存储方式关系密切。试想一下,如果图书馆中书籍杂乱无章的存放,那么要想找到心仪的书籍将会非常困难。为此,人们常常将物品按照某种规则或次序进行放置,目的是便于日后的查找。

作为查找算法家族中的一员,二分查找正是利用数据按次序存储这一优点,极大的提升了查找目标值所在位置的速度。

二分查找的核心思想是:首先将数组中间值和目标值进行比较,如果相等则返回;如果不相等,则选择中间值左边的一半或者右边的一半进行比较;不断重复直到检索完毕。首先来看下面这个gif,其中蓝色圈表示左位置,粉色圈表示右位置,绿色圈表示中间位置:

c++与python实现二分查找的原理及实现

首先定义的是左边界(蓝色圈)和右边界(粉色圈),进而根据左边界和右边界计算出中间位置(绿色圈);然后,比较中间位置的值和目标值的大小,比较结果包含3种情况

  • 如果相等则表示查找成功,返回中间位置;
  • 如果中间位置的值小于目标值,则说明目标值在中间位置到右边界这一半;
  • 如果中间位置的值大于目标值,则说明目标值在左边界到中间位置这一半;

上述步骤的循环需要终止条件,即左边界小于或等于右边界,表明此时已经搜索完成,目标数值不在数据中存在。

 

1、时间复杂度与优缺点

既然每次搜索后区间长度都减半,假设数据个数(即区间长度)为n,那么算法每次迭代得到的区间长度依次为n/2,n/4,n/8等等,其通项如下,k表示循环次数:

c++与python实现二分查找的原理及实现

最坏的情况,就是搜索到区间长度为1,即最后只剩1个元素:

 

c++与python实现二分查找的原理及实现

所以,可以求得最坏情况下需要运行的次数为:

c++与python实现二分查找的原理及实现

因此二分查找复杂度为O(logn),相比于顺序查找其速度获得了极大的提高(优点)。但是,必须注意二分查找需要保证数据是有序的,这就要求数据必须预先进行排序(缺点)。

 

2、python实现

def binary_search(ordered_list, target_value):
    """
    Args:
        ordered_list: data with order
        target_value: value that want be searched
    """
    left = 0
    right = len(ordered_list)-1
    # 终止条件
    while left <= right:
        # 中间位置计算
        mid = int((left+right)/2)
        if ordered_list[mid] == target_value:
            return "index is {}, target value is {}".format(mid, ordered_list[mid])
        # 此时目标值在中间值右边,更新左位置
        elif ordered_list[mid] < target_value:
            left = mid + 1
        # 此时目标值在中间值左边,更新右位置
        elif ordered_list[mid] > target_value:
            right = mid - 1
    # 搜索结束没有找到
    return "Not find"

 

3、C++实现

int binarySearch(int *orderedData, int dataLength, int targetValue) {
    int left = 0;
    int right = dataLength - 1;
    int mid;
    // 终止条件
    while (left<=right)
    {
        // 中间位置计算
        mid = (left + right) / 2;
        if (*(orderedData + mid) == targetValue) {
            return mid;
        }
        // 目标值在中间值右边,更新左位置
        else if (*(orderedData + mid) < targetValue){
            left = mid + 1;
        }
        // 目标值在中间值左边,更新右位置
        else
        {
            right = mid - 1;
        }
    }
    // 搜索不到,返回-1
    return -1;
}

到此这篇关于c++与python实现二分查找的原理及实现的文章就介绍到这了,更多相关c++与python实现二分查找内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://zhuanlan.zhihu.com/p/105906443

延伸 · 阅读

精彩推荐
  • C/C++C语言开发实现贪吃蛇游戏

    C语言开发实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了C语言开发实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    C 小白8882021-09-18
  • C/C++C++设计模式迪米特法则实例

    C++设计模式迪米特法则实例

    这篇文章主要为大家详细介绍了C++设计模式迪米特法则实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    wwxy2618172021-07-15
  • C/C++常见的C语言内存错误及对策

    常见的C语言内存错误及对策

    定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。浅显的例子就不举了,这里举几个比较隐蔽的例子。...

    C语言与C++编程4072020-10-19
  • C/C++VS2019中CMake项目如何指定c++语言标准

    VS2019中CMake项目如何指定c++语言标准

    这篇文章主要介绍了VS2019中CMake项目如何指定c++语言标准,需要的朋友可以参考下...

    江小举6022021-08-17
  • C/C++C语言菜鸟基础教程之a++与++a

    C语言菜鸟基础教程之a++与++a

    很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...

    翡翠森林Z10222021-06-04
  • C/C++C++函数pyrUp和pyrDown来实现图像金字塔功能

    C++函数pyrUp和pyrDown来实现图像金字塔功能

    这篇文章主要介绍了C++函数pyrUp和pyrDown来实现图像金字塔功能,如何使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样,需要的朋友可以参考下...

    C++教程网7242021-05-04
  • C/C++C++运算符重载的方法详细解析

    C++运算符重载的方法详细解析

    运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通...

    C++教程网5952021-01-07
  • C/C++有关C++头文件的包含顺序研究

    有关C++头文件的包含顺序研究

    下面小编就为大家带来一篇有关C++头文件的包含顺序研究。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网7022021-04-26