有人可以用C++解释这个算法吗?
Can someone please explain this algorithm in C++?
二次最大连续子序列和算法
int maxSubSum2( const vector<int> & a)
{
int maxSum = 0;
for (int i = 0; i< a.size(); ++i)
{
int thisSum = 0;
for (int j = i; j < a.size(); ++j)
{
thisSum += a[j];
if (thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
我想知道是否有人可以解释算法的工作原理?我擅长循环,我只是不擅长嵌套循环。每次第 8 行的外部 for 循环运行时,"thisSum"总是 0 还是静态的?
谢谢!我正在努力理解算法。请帮帮我!我非常感谢您的时间和精力。
外部循环遍历向量的每个元素 a
。在每次迭代中,i
将是当前元素的索引,它将thisSum
重置为 0
,然后执行内部循环。
内部循环从 i
开始遍历每个元素。在每次迭代中,j
将成为其当前元素的索引。然后,它会计算这些元素的总和 thisSum
。
如果外部循环高于已包含的内容,则maxSum
替换为thisSum
。
因此,如果向量包含:
1 7 -10 2 4
外部循环的连续迭代将计算以下thisSum
值:
1 + 7 + -10 + 2 + 4 = 4
7 + -10 + 2 + 4 = 3
-10 + 2 + 4 = -4
2 + 4 = 6
4 = 4
它将maxSum
第一次迭代设置为 4
。在第二次和第三次迭代之后,thisSum > maxSum
将为假,因此不会更改它。在第 4 次迭代中,6 > 4
,因此它将maxSum
设置为 6
。最后一次迭代不会更改它。最后,它将返回6
.
每次外部 for 循环循环时,由于外循环第一行的=0
,此总和都会重置为 0。
我建议你修改你的函数,在内部循环中打印i、j和thisSum,这样你就能看到它们是如何变化的。
示例 a = [1, 2, 3, 4, 5]
j 从 i 的值开始,因此它将首先从 0 开始,然后是 1,然后是 2,依此类推。因此,每次外循环递增时,第二个内循环都会变小。
thisSum 每次都重置为 0,因为它不是静态的。如果是,它将被标记为静态。
基本上,在这个算法中,外部循环用于推动"起始索引"向前,内部循环用于实际将数组/向量的所有元素相加。
因此,上面示例的内部循环的执行如下所示:
Execution 1: 1 + 2 + 3 + 4 + 5
Execution 2: 2 + 3 + 4 + 5
Execution 3: 3 + 4 + 5
Execution 4: 4 + 5
Execution 5: 5
希望有帮助。
thisSum 在你的代码行 8 处重置在循环 i 的开头部分,
但是这个在你的循环 j 中的总和是继续在循环 j 中添加数组 a[ ] 元素。
通常我会替换值并假设值来理解循环的工作原理。
假设向量 a 有 3 个 int 元素 10,-20,100
因此 a.size() = 3
//maxSum is initialized in the function
int maxSum = 0;
//Start First i loop
int i = 0; i < 3;
int thisSum = 0;
int j = i = 0; j < 3;
thisSum += a[0];
//thisSum = 10
//10 > 0
if (thisSum > maxSum) maxSum = thisSum = 10;
int j = i = 1; j < 3;
thisSum += a[1];
//thisSum = -10
// -10 not > 10
int j = i = 2; j < 3;
thisSum += a[2];
//thisSum = 90
//90 > 10
if (thisSum > maxSum) maxSum = thisSum = 90;
//End First i loop
//Start 2nd i loop
int i = 1; i < 3;
int thisSum = 0;
int j = i = 1; j < 3;
thisSum += a[1];
//thisSum = -20
//-20 not > 90
int j = i = 2; j < 3;
thisSum += a[2];
//thisSum = 80
//80 not > 90
//End 2nd i loop
//Start 3rd i loop
int i = 2; i < 3;
int thisSum = 0;
int j = i = 2; j < 3;
thisSum += a[2];
//thisSum = 100
//100 > 90
if (thisSum > maxSum) maxSum = thisSum = 100;
//End 3rd i loop
//return 100
//return maxSum
该函数的概念是它尝试逐步获得最大总和,将项目从最小的索引元素删除到最大的索引参数。
第一个循环 i :最大总和 = 90
第二个循环 i:最大总和 = 90(删除 10)
第三个循环 i:最大总和 = 100(删除 10,-20)
- 请解释"函数1(p1,p2,p3);"的输出
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 解释一下这个排序算法是如何工作的?
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 克鲁斯卡尔的算法解释
- C++行进立方体算法解释
- 有人可以用C++解释这个算法吗?
- 将 std::vector<unsigned int> 解释为位向量 - 高效算法?
- 算法复杂度- O(log n)的解释
- 解释这个算法(比较SURF算法中的点)
- 算法时间复杂度类型解释
- 解释两种几乎相同的算法的性能差异