各类递归式的复杂度
以下式子的复杂度分析带常数。
通常情况下,所有 \(\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;
}