【问题标题】:Time complexity for recurrence of a number数字重复的时间复杂度
【发布时间】:2018-10-23 21:34:46
【问题描述】:
   public static void fun3(int i)
    {
        if(i<10)
        {
            fun3(i+1);
            fun3(i+2);
            System.out.println(i);
        }
    }

此代码的重复是:T(n)=T(n+1)+T(n+2)+O(9) 问题是这里的条件if(i&lt;10)。其中i 可以向负侧增长到无穷大(例如 -1000 或 -287131287238238 等)。我需要使用递归树的时间复杂度。如何计算树的高度??

【问题讨论】:

  • 你的方法什么也不返回。这是故意的吗?
  • 是的!这是有意的
  • O(n) 估计 n 接近无穷大。在您的情况下,上限为 10(或任何其他最终数字),无论 n 变得多大,您都将拥有相同的成本。这导致 O(1)
  • 看下面的答案:你的问题的表述方式是O(1),其实不管数字多高只要是最终的,其他的都是你可能拥有的内幕知识我们不
  • 深度大约为 n - i,其中 n=10,但如果您只是想在纸上尝试一下(也适用于负 i),那将是显而易见的。这个例子也很糟糕,因为它会多次计算相同的路径

标签: algorithm data-structures time-complexity


【解决方案1】:

树的高度为abs(10 - i) for i &lt; 10 and 0 for i &gt;=10abs表示绝对值)。在每个级别,您的分支都是之前级别的两倍。当你总结它们时,你最终会得到O(2^abs(10-i)) or O(2^abs(i)) for i &lt; 10 and O(1) for i&gt;=10 的时间复杂度。该分析类似于斐波那契数列,您可以找到许多参考资料,例如this

【讨论】:

    【解决方案2】:

    由于您没有对i&gt;=10 的调用,并且对于所有i=0 .. 9,调用的数量是有限的,因此您对所有i 的调用总数有一个上限。

    因此答案是 O(1)
    常数因子是调用值i=0...9 的最大值。该代码表示​​最多调用i=0(或者如果不允许为0,则i=1)

    【讨论】:

    • 或者它可能会变成一百万
    • 您应该在问题中提及这一点,因为通常会针对论点增长的情况分析复杂性。所以 i -> infinity 的行为。
    猜你喜欢
    • 2021-09-20
    • 2016-12-20
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2016-02-13
    • 2012-08-14
    • 2014-01-09
    • 2013-01-21
    相关资源
    最近更新 更多