【问题标题】:Big O Notation: Nested Loop大 O 表示法:嵌套循环
【发布时间】:2020-10-16 10:24:06
【问题描述】:
     sum = 0;
      for (i = 0; i < m; i++)
        for (j = 0; j < m*m; j++)
           sum++;

一直在尝试用 Big-O 表示法计算该算法的时间复杂度。
我只发现第一个循环计为 O(m),第二个循环计为 O(m^2)。但我有一个问题。这个嵌套循环算作 O(m^3) 还是我必须以增长最快的函数为基础并说这个循环算作 O(m^2) ?

【问题讨论】:

  • 它是相乘的,所以O(m^3)。与简单循环相同的方式是O(n),但两个这样的嵌套循环是O(n*n)
  • 外循环是O(m),内循环是O(m^2),整体是O(m x m^2) = O(m^3)

标签: algorithm time-complexity big-o


【解决方案1】:

你必须计算sum++会有效执行多少次,而不是推测函数的增长。

每次调用内部循环时,它都会执行 sum++ 精确 m² 次。

并且内循环被外循环执行了 m 次,因此总共 m³ sum++

不用说,O(m³)。

【讨论】:

    【解决方案2】:

    在大学里对我有什么帮助,想想一个例子 - 例如。 2.

    for(int i = 0; i<2; i++)
    for(int j = 0; j<4; j++)
    

    所以循环运行8次,即2 * 4次,即8,即2*2*2,或

    【讨论】:

    • 一些与问题更相关的缩进和解释会有所帮助(m^2...)
    • @YvesDaoust 没有。尤其是那个解释,OP貌似是个初学者。
    • @e2-e4:OP 确实自己缩进了代码。我同意这个解释是弱的,因为“8 次”是毫无根据地宣布的,然后凭经验将其分解为 2³,这是作弊。
    • 我实际上想向 OP 展示一种方法来验证他的假设。不过,我的解释不充分是事实。
    • 这种“实验性”方法只有在你观察算法的内部工作时才能起作用,因为单一关系f(2)=8 告诉你f 没有任何用处。例如,这可以匹配 F(m)=2m², m+6, 2^(m²-1)...
    猜你喜欢
    • 2022-07-18
    • 2016-03-29
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多