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

计算机算法之二分算法

文章目录

  • 前言
  • 核心问题
  • 遍历查找思路
  • 遍历查找代码实现
  • 遍历查找缺点
  • 二分查找思路
  • 二分查找代码实现
  • 二分查找优点
  • 二分查找的变种
      • 问题一
      • 解题思路
      • 代码实现
      • 问题二
      • 解题思路
      • 代码实现

前言

大家好,我是醉墨居士,今天聊一下计算机中的经典算法 - 二分算法

核心问题

查找升序数组中某个数的索引

遍历查找思路

我们直接从头到尾遍历数组查找

判断当前数是否是要查询的数

如果是则直接返回索引

如果当前数大于要查询的数直接返回-1

如果不是则继续向后查找

如果最终也没找到,返回-1

遍历查找代码实现

def find_target(nums, target):for i in range(len(nums)):if nums[i] == target:return iif nums[i] > target:return -1return -1

遍历查找缺点

遍历查找没有利用数组是升序的特点,而是简单的暴力搜索,无法进行有效的剪枝
时间复杂度O(N),空间复杂度O(1)

二分查找思路

二分查找的核心就是利用数组是有序的特点

每次取待查找的区间的中点

如果中点对应的数等于要查找的数,直接返回中点索引

如果中点对应的数大于要查找的数,则在待查找的区间的左半区域进行查找

如果中点对应的数小于要查找的数,则在待查找的区间的右半区域进行查找

如果最终也没找到,返回-1

二分查找代码实现

def binary_find(nums, target):low, high = 0, len(nums) - 1while low <= high:mid = (low + high) >> 1if nums[mid] == target:return midelif nums[mid] > target:high = mid - 1elif nums[mid] < target:low = mid + 1    return -1

二分查找优点

合理利用有序数组这个特点,进行剪枝,每次查找都会减少一半的查询范围
时间复杂度O(Log N),空间复杂度O(1)

二分查找的变种

问题一

查找大于等于某个数最左边的数的索引,例如:[0,1,2,2,3,6,7] 中查找2的索引是2

解题思路

每次取待查找的区间的中点

如果中点对应的数大于等于要查找的数,则更新结果,并在待查找的区间的左半区域进行查找

如果中点对应的数小于要查找的数,则在待查找的区间的右半区域进行查找

如果最终也没找到,返回结果

代码实现

def find_left(nums, target):low, high = 0, len(nums) - 1ans = -1while low <= high:mid = (low + high) >> 1if nums[mid] >= target:ans = midhigh = mid - 1else:low = mid + 1return ans

问题二

查找旋转数组的最小值,例如:[4,5,6,7,0,1,2] 中的最小值为 0

解题思路

每次取待查找的区间的中点

如果中点对应的数大于右边界对应的数,则在待查找的区间的右半区域进行查找

如果中点对应的数小于等于右边界对应的数,则在待查找的区间的左半区域进行查找

直到最终查询完毕,返回左端点对应的数

代码实现

def find_min(nums):low, high = 0, len(nums) - 1while low < high:mid = (low + high) >> 1        if nums[mid] > nums[high]:low = mid + 1else:high = midreturn nums[low]
http://www.lryc.cn/news/280193.html

相关文章:

  • 获取当前设备的IP
  • koa2文件的上传下载功能
  • test-02-test case generate 测试用例生成 EvoSuite 介绍
  • 1.单表查询
  • FFmpeg 的使用与Docker安装流媒体服务器
  • Qt QListWidget列表框控件
  • 小知识分享2
  • 【Golang开源项目】Golang高性能内存缓存库BigCache设计与分析
  • Elasticsearch 7.8.0从入门到精通
  • 寻找最富裕的小家庭 - 华为OD统一考试
  • ssm基于Java的药店药品信息管理系统的设计与实现论文
  • Word插件-大珩助手-手写电子签名
  • Edge扩展插件安装位置
  • Git将本地项目上传到Gitee仓库
  • linux环境安装docker
  • 机器人技能学习-robosuite-0-入门介绍
  • 【工具】tmux简单用法
  • 使用 C++/WinRT 的错误处理
  • 计算机基础专升本笔记九-Windows7基础(一)Windows 7 介绍
  • LeetCode1109. Corporate Flight Bookings
  • 视觉SLAM十四讲|【五】相机与IMU时间戳同步
  • js null和undefined的区别
  • Arduino| IDE下载、安装和设置以及开发板的连接
  • Linux之Ubuntu环境Jenkins部署前端项目
  • QT下的几种实现modbus的库,记录
  • HarmonyOS4.0系统性深入开发18公共事件简介
  • 华为路由器OSPF动态链路路由协议配置
  • 常用注解/代码解释(仅个人使用)
  • 2024阿里云服务器ECS介绍_全方位解析_CPU性能详解
  • 向伟人学习反焦虑,在逆境中崛起