二分查找 —— 红蓝染色法
2024年12月2日大约 3 分钟算法数组二分查找红蓝染色法
二分查找 —— 红蓝染色法
原理
待查找区间:在这里特指未染色的部分!
以左闭右闭区间为例,对于 非递减 数组来说(其余有序数组同理),根据一次二分我们可以确定
- 若
, 则说明待查找的内容 (如果存在的话) 应该存在于 这一区间内,此时应该往 左侧查找- 此时把
及其右侧染上 蓝色 , 表示该区间内的元素满足 - 更新
- 因此
一定为蓝色
- 此时把
- 若
, 则说明待查找内容位于 这一区间内,因此需要往 右侧查找。- 此时把
及其左侧染上 红色 , 表示该区间内的元素满足 - 更新
- 因此
一定为红色
- 此时把
- 我们 不查找已染色的区域!
- 当待查找区间不合法的时候,结束查找
就是待查找元素位置
注意,一次二分只能够染一次色!因为你只能通过当前
左闭右开区间分析
如果换成查找左闭右开区间,那么根据上面的原理,我们也可以进行分析:
初始化区间为
, 其中进行二分:
判断
与 的大小关系:- 说明
及其左侧的元素都 - 我们把
及其左侧染成 红色 - 未染色的区间端点为
, 更新
- 说明
- 说明
及其右侧的元素都 - 把
及其右侧染成 蓝色 - 未染色的区间端点为
, 但由于是 左闭右开 区间,因此我们更新 以正好包裹未染色区间
- 说明
当待查找区间不合法的时候
,结束查找 就是待查找元素位置
思考
如果数组中存在多个
这种性质与什么有关?
时空复杂度分析
时间复杂度
空间复杂度
拓展
对于非递减数组,正常使用上述方法 (且能找得到的情况下) 的话,得到的会是 最左侧 元素的下标,即
如果我们要找
(仅限整数数组可用)