已排序数组中bisect_left(arr, x)与bisect_right(arr, x-1)的相等条件问询
已排序数组中bisect_left(arr, x)与bisect_right(arr, x-1)的相等条件问询
嘿,这个问题问到点子上了!咱们得先把bisect_left和bisect_right的核心逻辑搞清楚,再看什么时候它们的结果一致,什么时候不一样~
先快速回顾下两个函数的行为(默认数组是升序排序的哈):
bisect_left(arr, x):返回数组中第一个大于等于x的元素的索引;如果所有元素都比x小,就返回数组的长度。bisect_right(arr, x-1):返回数组中第一个大于x-1的元素的索引;如果所有元素都小于等于x-1,返回数组长度。
接下来分两种关键情况讨论:
情况1:数组中没有元素介于x-1和x之间
这种情况下,所有元素要么≤x-1,要么≥x。这时候:
- 第一个大于x-1的元素,其实就是第一个≥x的元素(因为中间没有其他数值了)
- 所以
bisect_left(arr, x)和bisect_right(arr, x-1)的结果完全一致。
最典型的就是数组元素全是整数的场景——因为x-1和x之间没有整数,所以只要数组里都是整数,这两个函数的返回值一定相等。举个例子:
数组[1,3,5,7],x=4:
bisect_left(arr,4)找第一个≥4的元素是5,对应索引2;bisect_right(arr,3)找第一个>3的元素是5,对应索引2,结果完全相等。
情况2:数组中存在元素介于x-1和x之间
这时候两者的结果就会不一样!比如数组里有某个元素y满足x-1 < y < x,那:
bisect_right(arr, x-1)会指向第一个这样的y的索引;- 而
bisect_left(arr, x)会指向第一个≥x的元素的索引,这个位置在所有y元素的后面。
举个实际的非整数数组例子:
数组[1.5, 2.2, 2.8, 3.3],x=3(此时x-1=2):
bisect_left(arr,3)找第一个≥3的元素是3.3,对应索引3;bisect_right(arr,2)找第一个>2的元素是2.2,对应索引1;
很明显,3≠1,两个结果完全不同。
所以总结下来:这两个函数的返回值并不是在任何情况下都相等,只有当数组中不存在x-1和x之间的元素时,结果才会一致;如果有介于两者之间的元素,结果就会产生差异。
备注:内容来源于stack exchange,提问作者srm26
相关产品推荐
相关产品推荐

