考虑维度Nx2
的矩阵,其中每行包含统一PDF的下限和上限(即概率密度函数)。
我想计算重叠的数量,其中重叠被定义为两个PDF重叠的条件,例如:
[2,5]
[3,6]
[3,5]
区间重叠。显然,如果三个PDF p1
,p2
和p3
重叠,我会计算三个重叠:p1
与p2
,{{1} }与p1
,p3
与p2
。
我创建了以下用于计算重叠的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
开始执行,但它仍在运行。
您是否可以建议一种降低算法复杂度的方法,可能先排除一些比较?
提前致谢。
答案 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的答案中描述的技术。