Java 交换搜索算法

Java 交换搜索算法,java,algorithm,Java,Algorithm,我有一个由n个整数组成的数组。我还有一个由k(k

我有一个由n个整数组成的数组。我还有一个由k(k 如果我用最明显的方法,我会得到n*k复杂性。 数组A不能(不得)排序

有没有更有效的方法来实现这一点

有没有更有效的方法来实现这一点

是:将
B
的元素放入a中。在
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;
}
Set bSet=newhashset(B.length);
for(inta:B)//O(k)
b增加(a);
对于(inti=0;i
如果可以对数组B进行排序,那么解决方案是显而易见的,对它进行排序,然后您可以将“contains”优化为log2(K),这样您的复杂性将是N*log2(K)

如果不能对数组B排序,那么唯一的方法就是直接向前N*K

更新


真的忘记了位掩码,如果你知道你只有32位整数,并且有足够的内存-你可以存储巨大的位掩码数组,如果“添加”和“包含”总是O(1),但是,当然,只有在非常特殊的性能优化中才需要它,如果您的整数在可以创建的范围内,并且可以使用最大值的长度进行数组(例如,可能
0,整数的范围是多少(
n
)@omainegra我觉得他们很疯狂。数组A是否可以排序?数组A不能排序。我的意思是,它当然可以,它是一个整数数组,但它会破坏程序的其余部分。使用
var newarray=newint[A.length];System.arrayCopy(A,0,newarray,0,A.length)将A复制到
newarray
。现在您可以对A的相同副本进行排序。不能对A进行排序并不意味着您不能对数据进行排序。这是错误的,用B创建哈希集的复杂性为O(klogk),而在A上循环的复杂性为O(nlogk),因此总的来说是O(nlogk+klogk),即O(logk(n+k))@libik这不是真的。添加到
哈希集是一个固定时间的过程。包含测试也是O(1),因此是递增的。因此第二个循环在n中是线性的,而第一个循环在k中是线性的。因此,总体复杂度是O(n+k)。好吧,你得到了点:)。但是,它只适用于小实例。hashset操作的复杂性随着我编写的值的大量实例的增加而增加……当然不是。只有当你拥有无限的记忆时,你才能以恒定的时间工作。否则就不行了。实际上,散列意味着,在一般情况下,您的问题与当前散列差异的乘积相同。因此,复杂度由可能的哈希解的数量来划分。真正的散列“contains”值是n/k,其中k是大常量,仍然是常量。在很小的情况下,k>n,因此它几乎是以恒定的时间工作的。(但是,如果运气不好,可以达到O(n)复杂度,但可能性太小,不能将其视为问题)bSet.contains复杂度不是1,而.add也不是1
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;
    }
}