一个简单的算法时间复杂度的有关问题
一个简单的算法时间复杂度的问题。
看书上有个题目是这样的:有一个算法T(n)=T(n-1)+n,T(1)=1。求T(n)的时间复杂度。
题目的答案是说因为T(n)实际计算的是1+2+3+...+n的值,根据公式它的值为(1+n)n/2所以时间复杂度为O(n^2);
但是我认为T(n)的逻辑是通过递归依次将1到n相加,时间复杂度应该为O(n)。
求哪种正确。
------解决思路----------------------
Sigma( T(n),2,n) =Sigma(T(n-1),1,n-1) +sigma(n,2,n)
于是
T(n) = T(1)+ sigma(n,2,n) =1+sigma(n,2,n) =sigma(n,1,n) = (n^2+n)/2 =O(N^2)
这个可以直接用数学方法计算出来的
------解决思路----------------------
毫无疑问复杂度O(n)
------解决思路----------------------
O(n^2) master 定理
看书上有个题目是这样的:有一个算法T(n)=T(n-1)+n,T(1)=1。求T(n)的时间复杂度。
题目的答案是说因为T(n)实际计算的是1+2+3+...+n的值,根据公式它的值为(1+n)n/2所以时间复杂度为O(n^2);
但是我认为T(n)的逻辑是通过递归依次将1到n相加,时间复杂度应该为O(n)。
求哪种正确。
------解决思路----------------------
Sigma( T(n),2,n) =Sigma(T(n-1),1,n-1) +sigma(n,2,n)
于是
T(n) = T(1)+ sigma(n,2,n) =1+sigma(n,2,n) =sigma(n,1,n) = (n^2+n)/2 =O(N^2)
这个可以直接用数学方法计算出来的
------解决思路----------------------
//实际代码
int T (int n) {
if (n == 1)
return 1 ;
return T (n - 1) + n ;
}
//相当于
int _T (int n) {
int _value ; //对应返回值寄存器
stack<int> s ;
s.push (n) ; //对应T (n)
while (true) {
if (s.top () == 1) { //对应n == 1
_value = 1 ;
s.pop () ; //对应return
break ;
}
s.push (s.top () - 1) ; //对应T (n - 1)
} ;
while (!s.empty ()) {
_value = _value + s.top () ; //对应+ n
s.pop () ; //对应return
}
return _value ;
}
毫无疑问复杂度O(n)
------解决思路----------------------
O(n^2) master 定理