【发布时间】:2013-12-12 02:46:00
【问题描述】:
我将尽可能清楚地解释我的问题。 Point[] right 是一个有序的点数组,每个Point 对象是一对Long x, y。
现在,这是我的目标。给定一个Point p 和它的p.y 坐标,我必须找到几个点Point p1, p2,其中(根据y 坐标)p 包括在内,显然是使用二分搜索。这是我的迭代实现。
/* Binary search for leftmost edge intersected by p */
Point p1, p2;
long px = p.x, py = p.y;
long div = 2;
long index = (left.length-1)/div;
while(true) {
// System.out.println("Left search-index:"+index+" Div: "+div);
if(left[(int) index].y.compareTo(p.y) >= 0){
if(left[(int) (index+1)].y.compareTo(p.y) <= 0){
p1 = left[(int) index];
p2 = left[(int) (index + 1)];
// System.out.println("p1 "+p1.x+" "+p1.y+"; p2 "+p2.x+" "+p2.y);
break;
}
else {
if(index/div == 0)
index = index + 1;
else
index = index + index/div;
}
}
else {
if(index/div == 0)
index = index - 1;
else index = index - index/div;
}
div = 2*div;
}
现在,问题:
- 这实际上是二分搜索吗?
-
div会溢出吗?我知道在运行时它会引发异常,但我不知道是什么以及由谁。 (这个问题发生在 SPOJ 提交上,我拥有的唯一信息是NZEC Runtime Error)。 - 有什么方法可以提高性能?我期待一个包含 5000-10000 点的数组。
我尝试了一个超过 75 个条目的数组,并且有执行的痕迹。 (请注意,此搜索是在 left 和 right 两个不同的数组上执行的,每个数组大约包含 75/2 个元素)
Left search-index:20 Div: 2
Left search-index:10 Div: 4
Left search-index:12 Div: 8
Left search-index:13 Div: 16
Left search-index:14 Div: 32
Left search-index:15 Div: 64
Left search-index:16 Div: 128
Left search-index:17 Div: 256
Left search-index:18 Div: 512
Right search-index:17 Div: 2
Right search-index:9 Div: 4
Right search-index:11 Div: 8
Right search-index:12 Div: 16
Right search-index:13 Div: 32
Right search-index:14 Div: 64
Right search-index:15 Div: 128
Right search-index:16 Div: 256
true
Left search-index:20 Div: 2
Left search-index:10 Div: 4
Left search-index:12 Div: 8
Left search-index:13 Div: 16
Left search-index:14 Div: 32
Left search-index:15 Div: 64
Left search-index:16 Div: 128
Left search-index:17 Div: 256
false
Left search-index:20 Div: 2
Left search-index:30 Div: 4
Left search-index:23 Div: 8
Left search-index:25 Div: 16
Right search-index:17 Div: 2
Right search-index:9 Div: 4
Right search-index:11 Div: 8
Right search-index:12 Div: 16
false
【问题讨论】:
标签: java search binary overflow