【问题标题】:how to determin the time complexity of this c program如何确定这个c程序的时间复杂度
【发布时间】:2013-02-28 15:43:55
【问题描述】:
void mystery2 (int n)
{
 int i;
 for (i = 1; i <= n; i++) {
    double x = i;
    double delta = 1 / (double)i;
    while ( x > 0 )
      x -= delta;
  }
return 0;
}

如何使用http://pages.cs.wisc.edu/~vernon/cs367/notes/3.COMPLEXITY.html#application 之类的跟踪表而不是通过猜测来确定该程序的时间复杂度?

【问题讨论】:

    标签: c algorithm time-complexity


    【解决方案1】:

    对于每次迭代,最初您有x=i,然后每次将x 递减1/i。所以这将重复i/(1/i)==i^2 次。

    因此,对于for(i=1;i&lt;n;++i) 的每次迭代,内部部分的复杂度为O(i^2)。当i 从 1 增长到 n 时,就像添加 (1^2+2^2+3^2+...+n^2),大致为 n^3/6。因此它是O(n^3)


        Outer loop(for)          Inner Loop
        I=1                      1
        I=2                      4
        I=3                      9
        ...                      ..
        I=N                      N^2
     TOTAL_                      ~N^3/6
    

    【讨论】:

    • Sum[n^2,{n,1,N}] 应该是(n+1)(2n+1)n/6
    • 哦 10x 你甚至为我做了一张桌子! :P 但是有什么“数学”方法可以得到 i/(1/i)==i^2 你是怎么得到的?因为它的钢铁感觉就像是一种“猜测”。
    • @user1980750 x 的初始值是i 对吧?在while 循环中,x 每次都会递减1/i,对吗?所以x0,理论上你需要i/(1/i)=i^2 这是数学。由于浮点数算术的精度损失,您可能需要多花一点时间或少一点时间。但这不应该改变这个内部循环的O(n^2) 边界。
    【解决方案2】:

    这相对简单:您需要确定两个嵌套循环各自执行多少次,并综合考虑复杂性。

    外部循环是一个微不足道的for 循环;它执行n 次。

    内部循环需要更多注意:它不断从i 中减去1/i,直到它变为零或变为负数。很容易看出,从x 中减去1 需要while 循环的i 迭代。由于x 最初设置为i,因此内部循环所花费的总时间为i^2

    因此,对于x,在1n 之间,总数是x 的平方和。

    Wolfram Alpha tells us that the answer to this is n*(n+1)*(2n+1)/6

    这扩展为n^3/3 + n^2/2 +n/6 多项式,其复杂度为O(n^3)

    【讨论】:

    • 虽然不用查公式。 guess 是最自然的O(n^3)
    • @phoeagon 我同意,这里的猜测是正确的。但是,OP 要求不要猜测,所以我让 alpha 为我做计算。
    • 谢谢,我想我理解了第二个循环分析背后的想法。但是有什么数学方法可以得到这个答案吗?因为我们在课堂上学会了使用 k 变量.. 然后得到 k==i^2
    猜你喜欢
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多