【问题标题】:What would be complexity of this recursive algorithm这个递归算法的复杂度是多少
【发布时间】:2018-04-13 22:53:02
【问题描述】:

如何计算像这样有点复杂的递归算法的复杂度 在这种情况下,something(0,n) 的复杂度是多少

void something(int b, int e) {
     if (b >= e) return;
     int a = 0;
     for(int i=b; i < e; i++)
     a++;
     int k = (b+e)/2;
     something(b, k);
     something(k+1, e);
     }

我试图分析这个算法,认为它的复杂度是 n*ln(n) 但仍然无法得到正式的证明。

【问题讨论】:

  • 怎么样?除非 b = e,否则我可以看到。哦等等没关系。有人声称会有一个无限循环,但我只能看到如果 b = e

标签: time-complexity code-complexity


【解决方案1】:

最初,循环会运行(e-b) 次,它会调用自己2次,但循环的大小会减少一半

所以,((e-b)/2) 将运行 2 次迭代;一次是(b,(b+e)/2),一次是((b+e)/2+1,e)

同样,两次迭代都会再次调用自己 2 次,但会将迭代长度减少一半。

所以 `((e-b)/4) 将运行 4 次,以此类推。

递归树的高度为log(b-e),(每个节点有2个孩子)

所以,time complexity = (b-e) + 2*((b-e)/2) + 4*((b-e)/4) + .....(log(b-e) times)

这个表达式的计算结果为(b-e)*log(b-e)

因此,时间复杂度 = O(nlogn)

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2015-11-29
    • 2019-05-08
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多