在一本书中读到,调用子程序被认为是一个恒定时间操作,即使子程序本身不是在恒定时间内执行,而是取决于输入大小。 如果我有以下代码:
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()视为一个恒定时间函数吗? 在某些情况下,这条规则会下降吗? 谢谢!
答案 0 :(得分:0)
不,你不能认为func(int m)
具有恒定的时间复杂性。其时间复杂度为O(T1(m) + T2(10))
,其中T1
和T2
分别是描述subrout
和subrout2
时间复杂度的函数。
在第二种情况下,从技术上讲,时间复杂度是不变的。
作为一般性评论,用渐近符号指定时间复杂度的关键是描述操作数量如何随输入大小的增加而增加。
答案 1 :(得分:0)
本书可能要说的是调用函数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) = n
和T_callee = O(f(n))
,则可以安全地说T_func = O(f(n))
。