我已经盯着这一段时间并且它没有下沉。我想我在基本层面理解发生了什么。例如。 A = {1,2,3,4}
Sum = A [0] + [A [0] + A [1]] + [A [0] + A [1] + A [2]] + [A [0] + A [1] + A [2] + A [3]]
但是,我无法通过下面的解释/符号来理解这些步骤 - 或者至少,它有点模糊。有人可以解释一下步骤/了解正在发生的事情。
示例1.4(子阵列的总和)。问题是为每个子阵列计算大小为n的数组a中的大小为m的[j..j + m-1],其元素的部分和为s [j] =Σm-1 k = 0 a [J + K]; j = 0,...,n-m。这些子阵列的总数是n-m + 1。
乍一看,我们需要计算m个项目中的每个n-m + 1个总和,以便运行时间与m(n-m + 1)成比例。如果m是固定的,则时间仍然线性地取决于n。但是如果m以n的分数生长,例如m = n 2,那么T(n)= cn 2n 2 + 1 = 0.25cn2 + 0.5cn。当n增加时,线性部分的相对重量0.5cn相对于二次方快速减小。
答案 0 :(得分:1)
嗯,您提供的解释似乎与您对问题的理解无关。我认为,您的示例1.4 非常关注。
A = {1, 2, 3, 4}, m = 3.
Sum = (A[0] + A[1] + A[2]) + (A[1] + A[2] + A[3]).
这里每个 n-m + 1 (4-3 + 1 = 2) m (3)个子元素。所描述的算法可以在这样的代码中执行:
function SumOfSubarrays(A, n, m) {
sum = 0;
//loop for subarrays
for (j = 0; j <= n - m; j++;) {
//loop for elements in each subarray
for (k = 0; k <= m - 1; k++) {
sum += A[j + k];
}
}
}
此算法的时间复杂度线性地取决于 n 。但是,正如示例1.4 所述,如果 m 增长为 n 的一小部分,那么时间复杂度就会变成二次方。
对于外部循环,您需要完全m(n−m+1)
次操作:(n−m+1)
,因为它是一些子数组,m
用于内部循环,因为它是每个子数组中的多个元素。如果 m 依赖于 n 那么您就拥有了,例如:
m = 0.5 * n
m(n-m+1) = 0.5n(n-0.5n+1) = 0.5n(0.5n-1) = 0.25n^2 - 0.5n
二次部分增长更快,因为它是二次的。