【问题标题】:Can someone please explain this algorithm in C++?有人可以用 C++ 解释这个算法吗?
【发布时间】:2015-01-09 01:04:46
【问题描述】:

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

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 还是静态的?

非常感谢!我正在努力理解算法。请帮我!我非常感谢您所付出的时间和精力。

【问题讨论】:

  • 您知道,这是一个非常慢的算法。有很多更快的算法。
  • thisSum 不是静态的(否则它会实际上被声明为静态的)。在外循环的每次运行中,它都设置回 0。

标签: c++ algorithm scope subsequence


【解决方案1】:

外部循环遍历向量a 的每个元素。在每次迭代中,i 将是当前元素的索引,它将thisSum 重置为0,然后执行内部循环。

内部循环遍历从i 开始的每个元素。在每次迭代中,j 将是其当前元素的索引。然后它计算thisSum 中这些元素的总和。

如果maxSum 高于它已经包含的内容,则外部循环将thisSum 替换为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 &gt; maxSum 将为 false,因此不会更改它。在第 4 次迭代中,6 &gt; 4,因此它将设置 maxSum6。最后一次迭代不会改变它。最后会返回6

【讨论】:

    【解决方案2】:

    每次外部 for 循环循环时,此总和都会重置为 0,因为=0 位于外部循环的第一行。

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

    【讨论】:

      【解决方案3】:

      示例 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
      

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

        但是循环 j 中的 thisSum 会在循环 j 中不断添加数组 a[ ] 元素。


        通常我会替换值并假设值以了解循环的工作原理。

        假设向量 a 有 3 个 int 元素 10,-2​​0,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)

        第三个循环 i : maxSum = 100 (去掉 10,-2​​0)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 2011-01-16
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多