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

 更新时间:2022年03月11日 09:06:28   作者:机器学习入坑者  
本文介绍了c++与python实现二分查找的原理及实现,二分查找指首先将数组中间值和目标值进行比较,如果相等则返回;如果不相等,则选择中间值左边的一半或者右边的一半进行比较;不断重复直到检索完毕,下文相关资料需要的朋友可以参考一下

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

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

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

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

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

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

1、时间复杂度与优缺点

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

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

 

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

因此二分查找复杂度为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实现二分查找内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt使用Matlab函数的详细步骤

    Qt使用Matlab函数的详细步骤

    由于项目需要,需要调用现有的matlab程序,下面这篇文章主要给大家介绍了关于Qt使用Matlab函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • c++隐式类型转换存在的问题解析

    c++隐式类型转换存在的问题解析

    隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换,这篇文章主要介绍了c++隐式类型转换存在的陷阱,需要的朋友可以参考下
    2022-03-03
  • 哈夫曼算法构造代码

    哈夫曼算法构造代码

    这篇文章主要介绍了哈夫曼算法构造代码,有需要的朋友可以参考一下
    2013-12-12
  • C语言中关于sizeof 和 strlen的区别分析

    C语言中关于sizeof 和 strlen的区别分析

    本文通过示例简单分析了4种情况下C语言中sizeof 和 strlen的区别,算是个人经验的一个小小的总结,如有遗漏还请大家告知。
    2015-02-02
  • 浅谈C++的几种从键盘输入方式

    浅谈C++的几种从键盘输入方式

    今天小编就为大家分享一篇浅谈C++的几种从键盘输入方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C++17使用std::optional表示可能存在的值

    C++17使用std::optional表示可能存在的值

    本文主要介绍了C++17使用std::optional表示可能存在的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟

    这篇文章主要介绍了C语言数据结构实现银行模拟的相关资料,通过此文希望大家能理解离散化的方法,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • C++实现四叉树效果(附源码下载)

    C++实现四叉树效果(附源码下载)

    这篇文章主要介绍了C++实现四叉树效果(附源码下载),非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • C语言之快速排序案例详解

    C语言之快速排序案例详解

    这篇文章主要介绍了C语言之快速排序案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 多继承详情介绍

    C++ 多继承详情介绍

    这篇文章主要介绍了C++ 多继承详情,C++支持多继承,即允许一个类同时继承多个类。只有C++等少数语言支持多继承,下面我们就来看看具体的多继承介绍吧,需要的朋友可以参考一下
    2022-03-03

最新评论