交换搜索算法

时间:2013-10-10 23:20:40

标签: java algorithm

我有一个n个整数的数组A.我还有一个k(k

如果我采用最明显的方式,我会达到n * k复杂度。 数组A不能(不得)进行排序。

是否有更有效的方法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

  

是否有更有效的方法来实现这一目标?

是:将B的元素放入HashSet。循环遍历A,如果您所在的元素包含在集合中,则将其增加3.这将具有O(n + k)复杂度。

例如:

Set<Integer> bSet = new HashSet<>(B.length);

for (int a : B)  // O(k)
    bSet.add(a);

for (int i = 0; i < A.length; i++) {  // O(n)
    if (bSet.contains(a[i]))
        a[i] += 3;
}

答案 1 :(得分:0)

如果数组B可以排序 - 那么解决方案是显而易见的,排序它,然后你可以优化“包含”为log2(K),所以你的复杂性将是N * log2(k)

如果你不能对数组B进行排序 - 那么唯一的就是直接向前N * K

更新

真的忘记了bitmask,如果你知道你只有32位整数,并且有足够的内存 - 你可以存储大量的bitmask数组,“add”和“contains”总是会是O(1),但当然只有非常特殊的性能优化才需要它

答案 2 :(得分:0)

如果你的整数在你可以创建的范围内,并且数组的长度最大(例如0 <= A[i] and B[i] <= 65535)那么你可以这样做

boolean [] constains = new boolean[65535];
for (int i = 0; i < k; i++){
    constains[B[i]] = true;
}

for (int i = 0; i < n; i++){
    if (constains[A[i]]){
        A[i] += 3;
    }
}

哪个是O(n + k)