如何加速这个对象比较算法?

时间:2013-09-04 12:04:46

标签: performance matlab comparison complexity-theory

考虑维度Nx2的矩阵,其中每行包含统一PDF的下限和上限(即概率密度函数)。

我想计算重叠的数量,其中重叠被定义为两个PDF重叠的条件,例如:

  • PDF1:[2,5]
  • PDF2:[3,6]
  • 两个PDF在[3,5]区间重叠。

显然,如果三个PDF p1p2p3重叠,我会计算三个重叠:p1p2,{{1} }与p1p3p2

我创建了以下用于计算重叠的MATLAB代码:

p3

但是,正如您可以想象的那样,for m = 1:N-1 for k = m+1:N l1 = dataService.getObjectCoordinate(m,1); l2 = dataService.getObjectCoordinate(k,1); u1 = dataService.getObjectCoordinate(m,2); u2 = dataService.getObjectCoordinate(k,2); if (l1 <= l2 && l2 <= u1) || (l2 <= l1 && l1 <= u2) numOverlaps = numOverlaps + 1; end end end 会变为O(N^2),当N很大时,这会非常糟糕。我在三个小时前用N=10000开始执行,但它仍在运行。

您是否可以建议一种降低算法复杂度的方法,可能先排除一些比较?

提前致谢。

2 个答案:

答案 0 :(得分:3)

我收回了我之前留下的评论。你绝对可以在更短的时间内完成这项工作。基于Rody和Shoelzer提供的链接,您可以使用以下代码在第二个下执行此操作

tic
numIntervals = 10000;
ranges = sort(randi(100,[numIntervals,2]),2);
[vals,idx] = sort(ranges(:,1));
ranges = ranges(idx,:);
overlaps = false(numIntervals);
for i = 1:numIntervals
    temp = [ranges(:,1) <= ranges(i,2),ranges(:,1) >= ranges(i,1)];
    overlaps(:,i) = logical(all(temp,2));
end
overlaps = tril(overlaps,-1);
toc

ranges将是您的间隔起点和终点的数组。

最后三角形部分的目的是删除任何重复对。如果P1重叠P2,那么显然P2会重叠P1。它还将通过删除对角线

来消除P1与自身重叠的事实

使用大量数据运行此操作时要非常小心,因为它使用的存储量会非常快地填满RAM,具体取决于您拥有的数量。我尝试将所有内容保存为逻辑阵列来帮助实现这一点,但它仍然可以快速增加。

你绝对可以删除存储部分并节省大量时间,但是你必须在每个循环中立即处理所有内容。

答案 1 :(得分:1)

您是否描述过您的代码?问题的很大一部分可能是您每次迭代调用dataService.getObjectCoordinate()四次。相反,尝试获取所有数据一次并在进行任何比较之前将其存储在数组中。

之后,使用Possible Interview Question: How to Find All Overlapping Intervals的答案中描述的技术。