【问题标题】:Function Time Complexity函数时间复杂度
【发布时间】:2017-02-13 11:06:09
【问题描述】:

hi 在书中读到,调用子程序被认为是一个恒定时间的操作,即使子程序本身并不以恒定时间执行,而是取决于输入大小。 然后,如果我有以下代码:

void func(int m){
int n = 10;
    subrout(m);//function which complexity depends on m
    subrout2(n);//function which complexity depends on n
}

我想我可以认为 func() 是一个常数时间函数,例如O(1)?

如果我有这个怎么办:

void func(){
    int n = 10;
    Type object;
    object.member_method(n);/*member function which time complexity depends upon n*/
}

我还能认为 func() 是一个常数时间函数吗? 在某些情况下这条规则适用吗? 谢谢!

【问题讨论】:

    标签: time-complexity complexity-theory asymptotic-complexity code-complexity


    【解决方案1】:

    不,您不能认为func(int m) 具有恒定的时间复杂度。它的时间复杂度是O(T1(m) + T2(10)),其中T1T2分别是描述subroutsubrout2时间复杂度的函数。

    在第二种情况下,时间复杂度在技术上是恒定的。

    作为一般评论,使用渐近符号指定时间复杂度的目的是描述操作数量如何作为输入大小的函数增加。

    【讨论】:

      【解决方案2】:

      这本书的意思可能是调用函数T_func 的时间复杂度是T_call + T_callee。这里T_call是为被调用者传递参数和设置环境的时间操作,T_callee是在子程序内部花费的时间。这本书说可以安全地假设T_call 是恒定的,而没有对T_callee 做出这样的假设。

      为了澄清假设我们有一个函数func,它调用一个子例程callee

        func(s){
            callee(s);
        }
      

      然后T_func(s) = T_call + T_callee(s)。如果size(s) = nT_callee = O(f(n)) 则可以肯定地说T_func = O(f(n))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2022-01-15
        • 2018-05-29
        • 2015-08-01
        相关资源
        最近更新 更多