一尘不染

二进制搜索O(log n)算法在顺序列表中查找重复项?

algorithm

有谁知道一种比线性快的算法,可以在顺序的数字列表中查找重复项?我现在正在用Java工作,但是任何语言或伪代码都可以。

例如,鉴于此int []输入:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 7 | 8 | 9

输出将是索引或值为“ 7”。

我知道O(n)线性时间有明显的遍历,但是我试图通过O(log n)时间二分查找来看看是否有可能。


阅读 293

收藏
2020-07-28

共1个答案

一尘不染

如果您假设数字必须从0开始并增加1,则可以将中间值与索引进行比较。如果中间相同,则走高,如果中间不同,则走低。

这将为您提供二进制搜索时间O(log2 N)。唯一的区别是您正在与索引进行比较,而不是固定值。


public static void main(String... args) {
    int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9};
    int duplicate = findDuplicate(array);
    System.out.println(duplicate);
}

private static int findDuplicate(int[] array) {
    int low = 0;
    int high = array.length - 1;

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = array[mid];

        if (midVal == mid)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return high;
}
2020-07-28