假设next()
是生成这个系列的函数:
8
9
16
25
27
32
36
49
64
81
哪个是
i=2,3,....
j=2,3,....
f(n) = minimum( pow(i,j) ) && f(n) > f(n-1)
我可以想出这个 O(n) 代码。是否有 O(1) 或 O(lg n) 解决方案?
int m =2, n = 2;
int last =4;
void next() {
int a=m+1,b=n+1;
long t = pow(a,b);
int ma = max(m,n);
//cout<<" max = "<<ma<<endl;
for(int i=2;i<=ma+1;++i){
for(int j=2;j<=ma+1;++j){
if(pow(i,j) > last && pow(i,j) <= t) {
a=i,b=j;
t = pow(i,j);
}
}
}
if(a>m) m=a;
if(b>n) n=b;
last = t;
//cout<<"\t"<<a<<"\t"<<b<<"\t"<<pow(a,b)<<endl;
cout<<" \t"<<pow(a,b)<<endl;
return;
}
}
注意: 1. 当我提到复杂性时,我只是在谈论对 next() 的一次调用。2. 缓存当然会有所帮助,但是我们可以考虑 lg-n 空间进行缓存吗?哎呀,缓存一切都更快。:) 3. 我不知道常数空间复杂度是否存在 O(lg-n) 的解决方案,这只是我的预感,可能存在..