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

标签 performance matlab comparison complexity-theory

<分区>

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

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

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

显然,如果三个 PDF p1p2p3 重叠,我计算三个重叠:p1对比 p2p1 对比 p3p2 对比 p3

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

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 开始执行,它仍在运行。

您能否建议一种降低所提出算法复杂性的方法,也许可以排除一些先验比较?

提前致谢。

最佳答案

我收回之前留下的评论。您绝对可以在更短的时间内完成此操作。根据 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 将是您的区间起点和终点的数组。

末尾的下三角部分的目的是删除任何重复的对。如果 P1P2 重叠,那么显然 P2 将与 P1 重叠。它还将通过删除对角线来消除 P1 与自身重叠的事实

在运行大量数据时一定要非常小心,因为它使用的存储量会很快填满您的 RAM,具体取决于您拥有的数量。我尝试将所有内容都保留为一个逻辑数组来帮助解决这个问题,但它仍然加起来很快。

您当然可以删除存储部分并为自己节省大量时间,但是您必须在每个循环中立即处理所有内容。

关于performance - 如何加速这个对象比较算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18613355/

相关文章:

mysql - 我们应该在下面的例子中使用 "LIMIT clause"吗?

asp.net - 在网站的过期 header 中设置多长时间比较合适?

java - Matlab解压MHA卷时怀疑java内存泄漏

android - 将图片从Android发送到PC上的Matlab

matlab - 创建归一化直方图并在 Matlab 上使用 Gamma 分布对其进行拟合

java - 与 NaN 不同,为什么浮点无穷大是相等的?

Java获取CPU核心使用率百分比

python - Pandas 类别比较

c++ - C++中比较的效率? (绝对值(X)> 1 对比绝对值(x)!= 0)

algorithm - UI 的快速布局算法