当前位置: 首页 > news >正文

二分查找算法(Python)

目录

1、概念

2、思路

3、实现算法


1、概念

二分查找又称折半查找,它是一种效率较高的查找方法

原理:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

2、思路

二分查询思想如下:

取左left、右边界right,以及左右边界的中间值index

如果所求的值小于索引index对应的值:

​ 将右边界right赋值为index-1,因为此时index所对应的值是大于所求值num,所以可以直接排除index.

赋值之前:

赋值之后:

如果所求索引的值大于索引值index对应的值:

​ 将左边界left赋值为index+1`,因为此时index所对应的值是小于所求值num,所以可以直接排除index.

赋值之前:

赋值之后:

理论同上,不再画图,可以看下面二分查找的动画:

如果index对应的值和num的值相等:

​ 所求值对应的索引就是index.

时间复杂度:O(logn),对长度为 n 的数组进行二分,最坏情况就是取 2 的对数。
空间复杂度:O(1),无额外空间

3、实现算法

3.1(递归代码实现二分查找算法)

   def binary_search(alist, item):if len(alist) == 0:return Falseelse:midpoint = len(alist)//2   #中间索引值if alist[midpoint]==item:return Trueelse:if item<alist[midpoint]:return binary_search(alist[:midpoint],item)else:return binary_search(alist[midpoint+1:],item)testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]print(binary_search(testlist, 3))print(binary_search(testlist, 13))

3.2 非递归的方式

def binary_search(alist, item):first = 0last = len(alist)-1while first<=last:midpoint = (first + last)//2if alist[midpoint] == item:return Trueelif item < alist[midpoint]:last = midpoint-1else:first = midpoint+1return False
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))

面试题口诀:

1.奇数二分取中间。

2.偶数二分取中间左边。

面试题:

(1)有一个有序表为1,5,8,11,19,22,31,35,40,45,48,49,50 。当二分查找值为48的节点时,查找成功需要比较的次数是?

(2)在拥有512个元素的数组中二分查找一个数,需要比较的次数最多不超过多少次。

解题方法1:

用512/2/2/2…直到最终等于1,中间除了几次2就是几次。

解题方法2:

2^n = 512 ,求解n的值即可。

解体方法3:

image-20230109204636675

​ 如果结果为整数,即为最终答案。

​ 如果是小数,则舍弃小数部分,整数再加1,为最终结果。

http://www.lryc.cn/news/196306.html

相关文章:

  • “第四十二天”
  • Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集
  • windows常用命令
  • 数据结构--堆
  • Android12之报错 error: BUILD_COPY_HEADERS is obsolete(一百六十七)
  • vue前端中v-model与ref的区别
  • 探索未来:硬件架构之路
  • Linux 系统安装 Redis7 —— 超详细操作演示!
  • 首次建站用香港服务器有影响没?
  • 大数据Flink(九十八):SQL函数的归类和引用方式
  • Python文件共享+cpolar内网穿透:轻松实现公网访问
  • Flink之源算子Data Source
  • 在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(一)
  • Apache atlas 元数据管理治理平台使用和架构
  • MFF论文笔记
  • Leetcode 02.07 链表相交(链表)
  • Bootstrap的媒体对象组件(图文展示组件),挺有用的一个组件。
  • Day2力扣打卡
  • 项目经理每天,每周,每月的工作清单
  • Java —— 运算符
  • 【C++ 中的友元函数:解密其神秘面纱】
  • YOLOv8涨点技巧:手把手教程,注意力机制如何在不同数据集上实现涨点的工作,内涵多种网络改进方法
  • 牛客:FZ12 牛牛的顺时针遍历
  • 函数防抖(javaScript)
  • 日常学习记录随笔-redis实战
  • MySQL事务MVCC详解
  • SQL RDBMS 概念
  • onlyoffice的介绍搭建、集成过程。Windows、Linux
  • 37. 解数独
  • git cherry-pick 合并某次提交