有人可以用C++解释这个算法吗?

Can someone please explain this algorithm in C++?

本文关键字:算法 解释 C++      更新时间:2023-10-16

二次最大连续子序列和算法

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)