【发布时间】:2013-05-09 11:33:50
【问题描述】:
下面的数组是排序的,没有小尺寸(小于 5000)的重复项(包含唯一的正整数),交集(见下文)被称为数十亿次,因此任何微优化都很重要。这个article 很好地描述了如何用C 语言加速下面的代码。
int i = 0, j = 0, c = 0, la = a.length, lb = b.length;
intersection = new int[Math.min(la, lb)];
while (i < la && j < lb) {
if (a[i] < b[j]) i++;
else if (a[i] > b[j]) j++;
else {
intersection[c] = a[i];
i++; j++; c++;
}
}
int[] intersectionZip = new int[c];
System.arraycopy(intersection, 0, intersectionZip, 0, c);
我想在 Java 中调用这些低级指令是不可能的。但他们提到“可以使用无分支实现来改进这种方法”。一个人会怎么做?使用switch?或者也许可以将a[i] < b[j]、a[i] > b[j] 或a[i] == b[i] 替换为整数操作数上的二进制运算?
二进制搜索方法(复杂度为O(la log(lb)))并非如此,因为la 不是<< 而不是lb。有趣的是如何更改 if 语句。
【问题讨论】:
标签: java arrays performance intersection