具有嵌套if语句和for循环的算法的时间复杂度

时间:2016-03-21 06:29:01

标签: algorithm big-o theory

所以我试图解决这个问题,但我和我的朋友们有点困惑

for (Int64 i = 1; i < Math.Pow(2, n); i = 2*i)
{
    if (i <= 4 || i >= Math.Pow(2, n - 2))
    {
        for (Int64 j = n; j >= 0; j = j - 2)
        {
            //constant number of C operations
        }
    }
    else
    {     
        for (Int64 j = n; j > 1; j = (Int64) Math.Ceiling((double) j/2))
        {
            //constant number of C operations
        }
    }
}

我认为外环是O(n)但是我无法得到内部部分,我很确定它只是O(n)因为最大的内部for循环i在O(n)处的顶部,与O(log n)的下部相对应 这是思考它的正确方法吗?或者我错了

1 个答案:

答案 0 :(得分:1)

  

但是我无法得到内在的部分,我很确定它只是O(n),因为内部for循环的最大部分是O(n)的顶部,与下部的一个相对应是O(log n)

顶部内环实际上是Θ(n)。并不是说内部是Θ(n),至少在你应该将它乘以外环的Θ(n)的意义上,获得总体Θ(n 2 。这是因为内部的顶部循环仅执行常数次。顶部内环的Θ(n)添加到外环的Θ(n)

此代码的总体复杂性为Θ(n log(n))。具体来说,它是Θ(n)Θ(log(n))(完全执行底部内环的总复杂度)+ Θ(n)+Θ(n) (完全执行顶部内循环的总复杂性)。