双指针二分法(范围映射/匹配问题)

最终需要解决的问题,范围映射/匹配

接收的数据范围(左开右闭)---需要发出去的数据
0          ==》0
0-0.1。    ==》1
0.1-0.3    ==》2
0.3-0.5    ==》3
0.5-1.0    ==》4
1.0-2.0    ==》5
2.0-3.0    ==》6
3.0-4.0    ==》7
小编最后才用了双指针二分法,有更好的方法希望大佬们在评论区反馈

在消息传递的时候我们很多时候需要做映射,比如:我们接收到的1是汽车,但是我们发出去的数据需要是3才能表示是汽车;通常我们使用map映射起来:

 private static final Map<String, String> ptcTypeMap = new HashMap<>();
 static {
        ptcTypeMap.put("0", "0");
        ptcTypeMap.put("1", "3");
        ptcTypeMap.put("2", "2");
        }

但是很明显,上面的map映射不足以解决问题,下面是笨一点的方法:

    public int test(double inNum) {
        if (0 < inNum && inNum <= 0.1) {
            return 1;
        } else if (0.1 < inNum && inNum <= 0.3) {
            return 2;
        }
        //.....
        return 0;
    }

很明显上面的方法很笨需要从上到下挨个找,那么就想起经常提到的二分法(递归),这样效率提升了不少(巧妙利用了数组的下标):

    //
    private static byte getEnum(double confidence, double[] arr) {
        //将不在我们规定范围的返回无效值
        return ((confidence <= arr[arr.length - 1]) && (confidence > 0)) ? binarySearch(arr, 0, arr.length - 1, confidence) : 0;
    }
   
    public static byte binarySearch(double[] arr, int left, int right, double findVal) {
        int pointLe = (left + right) / 2;
        int pointRi = ((left + right) / 2) + 1;
        if (arr[pointLe] < findVal && findVal <= arr[pointRi]) {
            return (byte) pointRi;
        } else if (findVal <= arr[pointLe]) {
            return binarySearch(arr, left, pointLe, findVal);
        } else if (findVal > arr[pointRi]) {
            return binarySearch(arr, pointRi, right, findVal);
        }
        return 0;
    }

测试一下:

    private static final double[] SPEED_CONF_ARR = {0, 0.1, 0.3, 0.5, 1.0, 2.0, 3.0, 4.0};

    public static void main(String[] args) {
        byte sp = getEnum(3.9, SPEED_CONF_ARR);
        System.out.println("sp = " + sp);//7
    }

有更好方法可以反馈给我,我学习一下

你可能感兴趣的:(Working,Knowledge,高效算法,java,算法)