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

目录
  • 1、时间复杂度与优缺点
  • 2、python实现
  • 3、C++实现

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

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

二分查找的核心思想是:首先将数组中间值和目标值进行比较,如果相等则返回;如果不相等,则选择中间值左边的一半或者右边的一半进行比较;不断重复直到检索完毕。首先来看下面这个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实现二分查找内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python直接调用和使用swig法方调用c++库

    c++运算速度快于python,python简单易写.很多时候对于已有的c++代码也不想用python重写,此时就自然而然地想到用python调用c或者c++,两全其美.然而根据这些博客的说法,python只能实现c的调用,如果需要调用c++,还需要对c++代码进行额外的处理. 首先是python调用c代码: //gcc -g -o libpycall_c.so -shared -fPIC pycall_c.c #include <stdio.h>  #include <stdlib.h

  • C++通过内嵌解释器调用Python及间接调用Python三方库

    目录 1.移植Python解释器 2.VS配置(VS2017为例,此教程与VS版本无关) 3.C++调用程序样例 4.被调Python程序样例 本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库 1.移植Python解释器 Python环境的目录结构 路径详解 需要用的如下图 1.红色部分是生成路径下解释器运行时依赖 将红色部分拷贝到C++编译主ExE路径下即可 2.蓝色部分是VS配置编译时依赖 路径或文件名 作用 DLLs Python内部运

  • 如何利用Python实现简单C++程序范围分析

    目录 1.实验说明 2.项目使用 3.算法原理 3.1构建CFG 3.2构建ConstraintGraph 3.3构建E-SSAConstraintGraph 3.4三步法 3.4.1Widen 3.4.2FutureResolution& Narrow 4.实验结果 5.总结 1. 实验说明 问题要求:针对静态单赋值(SSA)形式的函数中间代码输入,输出函数返回值的范围 实现思路: 基本根据 2013年在CGO会议上提出的“三步法”范围分析法加以实现[3],求得各个变量的范围 算法优势:空间复

  • c++和python实现顺序查找实例

    目录 (1)python实现顺序查找 (2)C++实现顺序查找 如何在一堆数据中找到某个数值的位置? 数值型数据作为信息的基本载体,广泛用于各种信息的记录,这些数据不仅需要被存储,更需要被使用.因此,从数据库中正确的找到目标数据,是至关重要的操作. 我们先不考虑计算机是如何完成数值查找的,你会如何从下面这张表(黑色是数值,蓝色是位置索引)中找到724这个数值? 显然,上面有序表所有的数值都按照次序进行排列,人眼可以根据数值大小关系确定区间从而很快的找到724在133位置上.但是,当我们面临的是几

  • 如何在C++中调用python代码你知道吗

    目录 一.环境设置 二.VS项目中设置 (1)首先在acaconda中找到include文件夹和libs文件夹,如图所示 (2)点击链接器,然后输入,附加依赖项,添加python36_d.lib的路径 (3)python代码 三.可能会出现的问题 总结 一.环境设置 windows VS2015 python的话用的是acaconda自带的python环境,不同版本的acaconda自带的python不同,我的是python3.6(这一步很重要,如果使用acaconda创建的虚拟环境的pytho

  • python 与c++相互调用实现

    目录 一.c++调用Python 1.Python脚本 2.C++调用python脚本 二.接口方法 1.规范化语法 三.Pthon调用c++ 1.基于extern 2.基于swig 一.c++调用Python 将Python安装目录下的include和libs文件夹引入到项目中,将libs目录下的python37.lib复制一份为python37_d.lib 1.Python脚本 def Hello():     print("Hello")       def Add(a,b):

  • C++和python实现单链表及其原理

    目录 一.链表的基本概念 二.单链表 1.python实现 (1)节点设计 (2)链表类:Single_Linked_List (3)判断链表是否为空:is_empty()函数 (4)头插法:add()函数 (5)尾插法:append()函数 (6)在任意位置插入:insert()函数 (7)计算链表长度:get_length()函数 (8)遍历所有节点:traversal()函数 (9)搜索:search()函数 (10)删除:delete()函数 2.C++实现 (1)节点设计 (2)链表类

  • C++调用python(执行py文件)的全过程

    1.首先要配好vs开发工程 注意版本:我这使用32位的python那么我vs工程这边也选择32位的编译环境去配置 注意点:需要将python安装目录的一些文件拷过来作为vs工程使用. 2.C++调用Python结果 py代码 这里引用了cdll库也需要放置到运行目录,py文件也是需要放置到运行目录(也就是exe生成所在目录) import os import time from ctypes import * def testDLL(): pDll = CDLL("./pythonTestCDl

  • Python 调用 C++ 传递numpy 数据详情

    目录 1.C++ 代码 2.Python 代码 1.C++ 代码 Demo.h #pragma once void GeneratorGaussKernel(int ksize, float sigma, float* kernel); void LeftAndRightMirrorImageUInt8(unsigned char* in, unsigned char* out, int width, int height); void LeftAndRightMirrorImageFloat(

  • Python与C++中梯度方向直方图的实现

    目录 什么是特征描述子 如何计算梯度方向直方图 Step1:预处理 Step2:计算梯度图 Step3:在8×8的cell中计算梯度直方图 Step4:16×16Block标准化 Step5:计算HOG特征向量 梯度直方图可视化 原文链接:Histogram of Oriented Gradients (文中的图片均来自翻译原文) 什么是特征描述子 特征描述子一张图片或者一个图片块的一种表示,通过提取有用信息并扔掉多余的信息来简化图像. 通常,特征描述子将一张大小为width×height×3

随机推荐