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

数据结构基础之《(3)—二分法》

一、认识二分法

1、经常见到的类型是在一个有序数组上,开展二分搜索
2、但有序真的是所有问题求解时使用二分的必要条件吗?不
3、只要能正确构建左右两侧的淘汰逻辑,你就可以二分

二、二分法怎么用

1、在一个有序数组中,找某个数是否存在

	public static boolean exist(int[] sortedArr, int num) {
		if (sortedArr == null || sortedArr.length == 0) {
			return false;
		}
		
		int L = 0;
		int R = sortedArr.length - 1;
		int mid = 0;
		
		while (L < R) {
			// 左移就是乘以二,右移就是除以二的意思
			// L 10亿 R 18亿,mid是整数,会溢出
			// N / 2,一个数除2,就等于这个数二进制形式带符号右移一位 N >> 1
			mid = L + ((R - L) >> 1); // 等于mid = (L + R) / 2
			if (sortedArr[mid] == num) {
				return true;
			} else if (sortedArr[mid] > num) {
				R = mid - 1;
			} else {
				L = mid + 1;
			}
		}
		return sortedArr[L] == num;
	}

2、在一个有序数组中,找>=某个数最左侧的位置
例子
12222222333333333344444444444
要找>=2最左侧的位置

	// 在arr上,找满足>=value的最左位置
	public static int nearestIndex(int[] arr, int value) {
		int L = 0;
		int R = arr.length - 1;
		int index = -1; // 记录最左的对号
		while (L <= R) {
			int mid = L + ((R - L) >> 1);
			if (arr[mid] >= value) {
				index = mid;
				R = mid - 1;
			} else {
				L = mid + 1;
			}
		}
		return index;
	}

3、在一个有序数组中,找<=某个数最右侧的位置
4、局部最小值问题
(1)0位置的数比1位置的数小,就是局部最小
(2)N位置的数比N-1位置的数小,就是局部最小
(3)i位置的数,既比i-1位置的数小,也比i+1位置的数小,就是局部最小
5、局部最小问题详解
arr无序数组,任意两个相邻的数都不相等,返回一个局部最小的位置
理解:把值连成一个线,总有高峰低谷

逻辑二分思想:
满足一个条件把另一侧全部排除掉的选项,就可以二分

	public static int getLessIndex(int[] arr) {
		if (arr == null || arr.length == 0) {
			return -1; // no exist
		}
		if (arr.length == 1 || arr[0] < arr[1]) {
			return 0;
		}
		if (arr[arr.length - 1] < arr[arr.length - 2]) {
			return arr.length - 1;
		}
		int left = 1;
		int right = arr.length - 2;
		int mid = 0;
		while (left < right) {
			mid = (left + right) / 2;
			if (arr[mid] > arr[mid - 1]) {
				right = mid - 1;
			} else if (arr[mid] > arr[mid + 1]) {
				left = mid + 1;
			} else {
				return mid;
			}
		}
		return left;
	}

三、二分法时间复杂度

1、二分法查找的时间复杂度是依赖于2的几次方,所以O是log2(N),以2为底可以直接写成logN
 


http://www.kler.cn/a/293931.html

相关文章:

  • 第三十六章 Vue之路由重定向/404页面设置/路径模式设置
  • Linux设置Nginx开机启动
  • RAG综述:《A Comprehensive Survey of Retrieval-Augmented Generation (RAG)》
  • Java中的不可变集合:性能与安全并重的最佳实践
  • 将大型语言模型(如GPT-4)微调用于文本续写任务
  • 给查询业务添加redis缓存和缓存更新策略
  • mysql高级sql
  • RAG与LLM原理及实践(14)---RAG Python 前端构建技术Flask
  • 『功能项目』Unity连接读取本地数据库【28】
  • Xcode打包出现错误Command PhaseScriptExecution failed with a nonzero exit code
  • 前端***
  • 使用Python读取Excel数据的详细指南
  • mhtml图片提取 百度图片下载
  • 使用html+css+layui实现动态表格组件
  • MySQL报错:[Err] 1075 - Incorrect table definitionmysql
  • 提高开发效率的实用工具库VueUse
  • 【2024数模国赛赛题思路公开】国赛D题思路丨附可运行代码丨无偿自提
  • 数据仓库: 6- 数据仓库分层
  • AI模块在人工智能中扮演着什么样的角色
  • 【机器学习】朴素贝叶斯方法的概率图表示以及贝叶斯统计中的共轭先验方法
  • idea中配置Translation插件完成翻译功能
  • 视觉语言模型(VLMs)知多少?
  • C#基础(6)值类型和引用类型
  • 7.统一网关-Gateway
  • 前端跨域问题详解与解决方案指南
  • ArcGIS Pro SDK (十三)地图创作 3 特殊图层