在通过分而治之的方法查找数组中的反转次数的过程中,我遇到了一个实现合并步骤的问题:我们有两个排序的数组,任务是计算第一个数组的元素时的情况数大于第二个元素。
例如,如果数组是v1 = [1,2,4], v2 = [0,3,5]
,我们应该计算 4 次反转。
因此,我在 Matlab 中实现了合并步骤,但我遇到了如何使其快速的问题。
首先,我尝试了蛮力方法
tempArray = arrayfun(@(x) length(find(v2>x)), v1)
它和下一个片段一样工作得太慢
l = 1;
s = 0;
for ii = 1:n1
while(l <= n2 && p1(ii)>p2(l))
l = l + 1;
end
s = s + l - 1;
end
有没有什么好办法让它更快?
编辑
感谢您的回答和方法!我为我的进一步工作找到了有趣的东西。
这是片段,这应该是我尝试过的最快的
n1 = length(vec1); n2 = length(vec2);
uniteOne = [vec1, vec2];
[~, d1] = sort(uniteOne);
[~, d2] = sort(d1); % Find ind-s IX such that B(IX) = A, where B = sort(A)
vec1Slice = d2(1:n1);
finalVecToSolve = vec1Slice - (1:n1);
sum(finalVecToSolve)