所有连续子阵列优化的总和
Sum of all contiguous subarrays optimisation
我正在解决一个问题,我有一个数组,对于两个给定的索引min
和max
,我需要找到它们之间所有连续子数组的总和。
我能想到的就是这个 O(n2) 代码
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)
从0
到i
的元素的总和。这可以通过以下方法轻松计算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];
}
然后,对于任何元素i
和j
,您可以计算sum(i,j) = A[j] - A[i]
(根据输入要求调整边界)。
没有更快的解决方案。
由于您的输出大小为 O(n2),因此算法不会更快。
当max-min+1
n
时,您需要打印n(n-1)/2
总和。这是 O(n2) 值。生成 O(n 2) 值的最快算法的时间复杂度为 O(n2),因此您的解决方案已经是最优的。
对于非常大的计算块或实时数据分析之类的事情,由于数组的内容不会改变,因此您可以在并行线程中进行计算。
对于一般情况,只需循环它们,让编译器展开并使用矢量化指令。
相关文章:
- 空基优化子对象的地址
- OpenMP阵列性能较差
- 关闭||运算符优化
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 位阵列上的快速AND运算
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 阵列必须使用大括号封闭的初始器进行初始化
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- 操纵2D阵列的可能优化
- 所有连续子阵列优化的总和
- 如何优化 3D 复杂阵列的"for 循环"<double>以提高C++速度
- 优化 2D 阵列C++