java - 在排序列表中找到最近/最接近的值

标签 java binary-search

<分区>

我想知道是否有可能在已排序的 List 中为列表中的元素找到最接近的元素。

例如,如果我们有值 [1,3,6,7] 并且我们正在寻找最接近 4 的元素,它应该返回 3,因为 3 是数组中最大的数字,它小于 4 .

我希望这是有道理的,因为英语不是我的母语。

最佳答案

因为集合是排序的,所以可以在 O( log n ) 中进行修改后的二分查找:

    public static int search(int value, int[] a) {

        if(value < a[0]) {
            return a[0];
        }
        if(value > a[a.length-1]) {
            return a[a.length-1];
        }

        int lo = 0;
        int hi = a.length - 1;

        while (lo <= hi) {
            int mid = (hi + lo) / 2;

            if (value < a[mid]) {
                hi = mid - 1;
            } else if (value > a[mid]) {
                lo = mid + 1;
            } else {
                return a[mid];
            }
        }
        // lo == hi + 1
        return (a[lo] - value) < (value - a[hi]) ? a[lo] : a[hi];
    }

由于上面的大部分代码都是二进制搜索,您可以利用 binarySearch(...)在 std 库中提供并检查 插入点 的值:

    public static int usingBinarySearch(int value, int[] a) {
        if (value <= a[0]) { return a[0]; }
        if (value >= a[a.length - 1]) { return a[a.length - 1]; }

        int result = Arrays.binarySearch(a, value);
        if (result >= 0) { return a[result]; }

        int insertionPoint = -result - 1;
        return (a[insertionPoint] - value) < (value - a[insertionPoint - 1]) ?
                a[insertionPoint] : a[insertionPoint - 1];
    }

关于java - 在排序列表中找到最近/最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245166/

相关文章:

Java,检查字符串是否为回文。不区分大小写

java - 在拥挤的图像中使用 opencv 确定文本区域

java - 使用 XStream 生成 header 标签

c++ - 线性搜索 vs 二进制搜索效率

c - 排序数组中元素出现的次数

java - 毫秒到天

java - Admob 广告出错(广告加载完毕)

c - 在 C 中搜索数据结构数组的成员

c++ - C++ lower_bound()搜索最接近目标值的元素

c# - 如何在 List<T>.BinarySearch 中有效地复制 ArrayList.BinarySearch?