各类递归式的复杂度

以下式子的复杂度分析带常数。

通常情况下,所有 \(\log n\) 的实际值应为 \(\log n+1\),因为数据为 \(n\) 时递归层数为 \(\log n+1\) 但是 \(+1\) 一般影响不大,故无特殊说明,不做考虑。

一般的分析方法,列求和式子,对每一层计算复杂度。

一般式

\(T(n)=aT({n\over b})+f(n),T(b^k)=\sum_{i=0}^k f(b^i)\times a^{k-i}\)

\(a=b\) 时:

\(T(n)=aT({n\over a})+n,T(n)=n\log_a n\)

\(a\gt b\)\(T(n)=aT({n\over b})+n\),则 \(T(b^k)={a(a^k-b^k)\over a-b}\),当 \(k\) 很大时,可以记为 \(T(b^k)={a^{k+1}\over a-b}\),经过简单的代数推导,\(T(n)={a\over a-b}\times n^{\log_b a}\)

2-2 式

\(T(n)=2T({n\over 2})+n,T(n)=n\log n\)

\(T(n)=2T({n\over 2})+n^2,T(n)={n^2\over 2}\)

\(T(n)=2T({n\over 2})+\sqrt n,T(n)=(2+\sqrt 2)n\)

\(T(n)=2T({n\over 2})+n\sqrt n,T(n)=(2+\sqrt 2)n\sqrt n\)

\(T(n)=2T({n\over 2})+\log n,T(n)=4n\)(这个式子特殊,\(\log n\) 必须解释为 \(\log n+1\),否则会产生很大的常数差异)

\(T(n)=2T({n\over 2})+n\log n,T(n)={n\log^2 n\over 2}\)

如果钦定 \(T(1)=1\),以上式子在 \(n\geq 5\times 10^4\) 时的相对误差不超过 \(0.1\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
mt19937 mt(__builtin_ia32_rdtsc());
inline int rd(int l,int r){return mt()%(r-l+1)+l;}
const double eps=0.2;
const int inf=1e9;
double log(double a,double x){return log(x)/log(a);}
int a=2,b=2;
double f(int x){return x;}
double dfs(int x){
	if(x==1) return 1;
	return a*dfs(x/b)+f(x);
}
double T(int n){return n*log(2,n);}
double mx=0;
signed main(){
	int n=1;
	for(int i=1;n<=inf;i++){
		n*=b;
		if(n>=5e4){
			mx=max(mx,abs(T(n)-dfs(n))/dfs(n));
		}
	}
	printf("%.4lf\n",mx);
	return 0;
}
posted @ 2025-04-15 19:49  born_to_sun  阅读(32)  评论(0)    收藏  举报