值与区域匹配,
0 - > [0,60)
100 - > [60120)
200 - > [120180)
...
如果我的值为160,程序应该返回200,因为160在(120,180)中。
有没有快速的方法来做到这一点?
最好用Java来描述。
感谢。
更新
1.也许有很多结果标签,如下:
0,1,2,... i ...,(i ++)
2.区域范围不会总是增加60。
[0,60]
[60,100]
...
答案 0 :(得分:1)
对于长度相等的区域,您可以指定与数组中的区域对应的结果值,并根据输入值计算数组索引,如下所示:
public class Example {
private static final int[] MAPPING = {0, 100, 200};
private static final int REGION_LENGTH = 60;
public static int encode(int value) {
// TODO apply range check to avoid ArrayIndexOutOfBounds
return MAPPING[(value / REGION_LENGTH)];
}
public static void main(String[] args) {
System.out.println(encode(160)); // prints 200
}
}
答案 1 :(得分:1)
存储区域的右端。然后使用二进制搜索来查找最大右端的索引,该索引大于输入值。打印/返回该索引的特殊值。
public static int getSpecialValue(int inputValue, int specialValue[], int rightIndex[]) {
int hi = rightIndex.length - 1, low = 0; // N = number of regions
while( hi >= low ) {
int mid = (hi + low)/2;
if( rightIndex[mid] > inputValue) {
hi = mid - 1;
} else {
low = mid + 1;
}
}
return specialValue[hi];
}
运行时分析:O(lg(N))
,其中N =区域数。
如果区域总是增加60,那么您可以按照之前的答案进行,这需要O(1)运行时间。
如果区域边界很小(小于1百万左右),则可以在O(R)时间内预处理输出,其中R是最右边区域的右索引,然后在O(1)中回答每个查询时间。
答案 2 :(得分:0)
desValue=((Inputvalue)/60)*100;
Inputvalue应为整数。
答案 3 :(得分:0)
使用binary search tree
(或只是array
)
根据间隔的first value
进行搜索,即value <= x
现在
if( `end` of `interval > x`)
you got the interval
else
no interval contains x.
时间复杂度:O(log N)。