【发布时间】:2014-09-05 13:47:23
【问题描述】:
我想以对数时间计算第 n 个斐波那契数。所以,我写了这个函数
vector<vector<ll> > expon(ll k)
{
if(k==1)
{
vector<vector<ll>> A({{1,1},{1,0}});
return A;
}
auto A = expon(k/2);
ll tmp[2][2] = {{0,0},{0,0}};
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
tmp[i][j] += (A[i][k]*A[k][j])%modv;
vector<vector<ll>> B({{tmp[0][0],tmp[0][1]},{tmp[1][0],tmp[1][1]}});
if(k%2)
return vector<vector<ll>>({{(tmp[0][0]+tmp[0][1])%modv,tmp[0][0]},{(tmp[1][0]+tmp[1][1])%modv,tmp[1][0]}});
else
return B;
}
但有些我认为它花费了太多时间。所以我想知道,它实际上是对数吗?我的意思是我的代码。
【问题讨论】:
-
"logarithmic" 可能是复杂度,这并不意味着算法很快:)
-
时间太多怎么办?您是否使用过优化标志进行编译?与
k相比,运行时间增加了多少?
标签: c++ algorithm time-complexity matrix-multiplication fibonacci