【问题标题】:Running time of for loop - part #2for 循环的运行时间 - 第 2 部分
【发布时间】:2011-10-10 11:37:35
【问题描述】:

这将是我关于分析 for 循环运行时间的问题的第 2 部分

http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L03-BigOhSolutions.htm#PR4 包含解决方案,我对两个特定的“for”循环有疑问

有人可以向我解释如何计算他们两个的运行时间。谢谢!

1.

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        for( k = 0; k < j; k++)
            sum++;  

2.

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        if (j % i ==0)
           for( k = 0; k < j; k++)
               sum++;

【问题讨论】:

    标签: performance big-o


    【解决方案1】:

    第一个sn-p是O(n^5)

    Top Loop    = 0 - O(n)   = O(n)   iterations
    Middle Loop = 0 - O(n^2) = O(n^2) iterations
    Inner Loop  = 0 - O(n^2) = O(n^2) iterations
    
    Total = O(n^5)
    

    这是第一个 sn-p 的封闭式解:(通过 Mathematica 计算)

    sum = -(1/10)*n + (1/4)*n^2 - (1/4)*n^4 + (1/10)*n^5
    

    这是一个五阶多项式,因此它是:O(n^5)

    第二个 sn-p 似乎是 O(n^4)

    Top Loop    = 0 - O(n)   = O(n) iterations
    Middle Loop = 0 - O(n^2) = O(n^2) iterations
    If statement enters: O(1 / n) times
    Inner Loop  = 0 - O(n^2) = O(n^2) iterations
    
    Total = O(n^4)
    

    这是第二个 sn-p 的封闭式解:(通过 Mathematica 计算)

    sum = -(1/12)*n + (3/8)*n^2 - (5/12)*n^3 + (1/8)*n^4
    

    这是一个四阶多项式,因此它是:O(n^4)

    if语句作用的进一步解释:

    中间循环从 0 迭代到 i*i。 if 语句检查j 是否可以被i 整除。但这只有在ji 的倍数时才有可能。

    如果0 &lt;= j &lt; i*iji 的倍数?正是i 次。因此只有1/i的中间循环迭代会落到最里面的循环。

    【讨论】:

    • 你能详细说明一下封闭的表格吗,这是我最休息的。我正在寻找这样的东西stackoverflow.com/questions/7375296/…
    • 所以你对我是如何得到那些封闭式方程感兴趣的?
    • 对于#1,我想出了这样的东西 Sum(Sum j, j= 0.....i*i),i = 0 .......n)
    • 我对封闭形式更感兴趣,而不是“至多”
    • 这正是我所做的。我将这个三重循环表达为三重求和。然后我把它扔进 Mathematica,它给了我这个结果。然后我根据实际代码本身对其进行了验证。同样适用于#2,但if语句有所不同。如果您有兴趣逐步了解如何以代数方式从三重求和到最终多项式 - 这并不容易。反正我已经很久没有手工做过这种事情了。
    【解决方案2】:

    'n' 以及第二个 for 循环语句(...,x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多