如何通过区域中的给定值获取特殊值?

时间:2014-03-15 08:54:38

标签: java algorithm

值与区域匹配,

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]

...

4 个答案:

答案 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)。