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

时间:2015-01-09 01:04:47

标签: c++ algorithm scope subsequence

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

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;
}

我想知道是否有人可以解释算法是如何工作的?我对for循环很好,我对嵌套的很好。每次第8行的外部for循环运行时,“thisSum”始终为0还是静态?

非常感谢!我正在努力理解这个算法。请帮我!我非常感谢时间和精力。

4 个答案:

答案 0 :(得分:2)

外部循环迭代向量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。在第2次和第3次迭代之后,thisSum > maxSum将为false,因此不会更改它。在第4次迭代6 > 4,因此它会将maxSum设置为6。最后一次迭代不会改变它。最后,它将返回6

答案 1 :(得分:0)

每次外部for循环循环时,由于外部循环第一行上的=0,此总和将重置为0。

我建议你修改你的函数,在内循环中打印i,j和thisSum,这样你就可以看到它们是如何变化的。

答案 2 :(得分:0)

示例a = [1,2,3,4,5]

j从i的值开始,因此它首先从0开始,然后是1,然后是2,依此类推。因此,每当外环增量时,第二个内环就会变小。

thisSum每次都重置为0,因为它不是静态的。如果是,它将标记为静态。

基本上,在这个算法中,外循环用于推送起始索引&#39;向前,内部循环用于实际将数组/向量的所有元素一起添加。

所以上面例子的内部循环的执行就像这样:

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

希望有所帮助。

答案 3 :(得分:0)

你的代码行8中的thisSum在循环 i 的开始部分重置,

但是循环j中的thisSum继续在循环 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:maxSum = 90

第二循环i:maxSum = 90(删除10)

第3次循环i:maxSum = 100(删除10,-20)