BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #93694同步于 2017/6/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

有序数组查找范围怎么做比较合适

ml3615556
2017/6/29镜像同步14 回复
给定有序数组nums 给定范围(A,B),[A, B), [A, B], (A, B] 返回范围内的数组 subNums 在有重复数字的情况下,二分搜索不能命中重复数字的第一个,很烦 有没有优雅的lgn做法,除了构建segment tree
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hxidkd机器人#1 · 2017/6/29
数字重复对二分不影响吧。std:: lower_bound也是用的二分返回第一个大于等于的数啊。
caesar11机器人#2 · 2017/6/29
“这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的 【 在 ml3615556 的大作中提到: 】 : 给定有序数组nums : : 给定范围(A,B),[A, B), [A, B], (A, B] : : 返回范围内的数组 subNums : : 在有重复数字的情况下,二分搜索不能命中重复数字的 : ......... 发自「贵邮」
ml3615556机器人#3 · 2017/6/29
...退化成o(n)了 【 在 caesar11 的大作中提到: 】 : “这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的 : : 发自「贵邮」
ml3615556机器人#4 · 2017/6/29
数字重复还是有影响的,普通的二分搜索并不能保证一定能命中哪个值。 这个是容器提供的方法吧,我就想知道它怎么做到的 难道加个0.5上去搜? 【 在 hxidkd 的大作中提到: 】 : 数字重复对二分不影响吧。std:: lower_bound也是用的二分返回第一个大于等于的数啊。
hxidkd机器人#5 · 2017/6/29
可以参考这里的实现 http://en.cppreference.com/w/cpp/algorithm/lower_bound 【 在 ml3615556 的大作中提到: 】 : 数字重复还是有影响的,普通的二分搜索并不能保证一定能命中哪个值。 : 这个是容器提供的方法吧,我就想知道它怎么做到的 : 难道加个0.5上去搜? : ...................
jkfbrant机器人#6 · 2017/6/29
说明还没吃透二分查找
Macaulish64机器人#7 · 2017/6/29
只是你写法有问题比如把代码贴出来?
caesar11机器人#8 · 2017/6/29
是的,所以你问出这个问题,表明你没真正理解二分查找,跟我当时的状态是类似的。去看看lower_bound和upper_bound的实现吧。 【 在 ml3615556 的大作中提到: 】 : ...退化成o(n)了 : : 【 在 caesar11 的大作中提到: 】 : : “这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的 : : : ......... 发自「贵邮」
ml3615556机器人#9 · 2017/6/29
这个实现非常好 唉,可惜Java里面没有这样的实现,它的二分一旦命中目标就返回了 ```java private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = a[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } ``` 【 在 hxidkd 的大作中提到: 】 : 可以参考这里的实现 : http://en.cppreference.com/w/cpp/algorithm/lower_bound