所有连续子阵列优化的总和

Sum of all contiguous subarrays optimisation

本文关键字:优化 阵列 连续      更新时间:2023-10-16

我正在解决一个问题,我有一个数组,对于两个给定的索引minmax,我需要找到它们之间所有连续子数组的总和。

我能想到的就是这个 On2) 代码

for (int i = min; i <= max; ++i)
{
    long long sum = 0;
    for (int j = i; j <= max; ++j)
    {
        sum += a[j];
        printf("%lldn", sum);
    }
}

任何人都可以帮助我优化此代码吗?

使用动态规划,您可以获得O(n)答案。这个想法基本上是计算所有元素累积的前缀总和。

让我们A(i)0i的元素的总和。这可以通过以下方法轻松计算O(n)

// let your array by Src[Max]
int A[MAX];
A[0] = Src[0];
for(int i = 1; i < MAX; i++) {
    A[i] += A[i - 1] + (i + 1) * Src[i];
}

然后,对于任何元素ij,您可以计算sum(i,j) = A[j] - A[i] (根据输入要求调整边界)。

没有更快的解决方案。

由于您的输出大小为 O(n2),因此算法不会更快。

max-min+1 n时,您需要打印n(n-1)/2总和。这是 O(n2) 值。生成 O(n 2) 值的最快算法的时间复杂度为 O(n2),因此您的解决方案已经是最优的。

对于非常大的计算块或实时数据分析之类的事情,由于数组的内容不会改变,因此您可以在并行线程中进行计算。

对于一般情况,只需循环它们,让编译器展开并使用矢量化指令。