c++ - 这个矩阵博览会代码是对数的吗?

标签 c++ algorithm time-complexity matrix-multiplication fibonacci

我想用对数时间计算第 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;
}

但有些我认为它花费了太多时间。所以我想知道,它实际上是对数的吗?我是说我的代码。

最佳答案

复杂度是对数的,但实现不是最优的。您不需要递归,也不需要为矩阵的每个幂创建单独的 vector 实例。另一个评论 - 你有重复的变量 k 这会导致警告,具体取决于编译器设置。

有一种方法可以检查给定的代码片段是否是对数的 - 测量输入 nn^2n 所花费的时间^4。如果复杂度是对数的,则每个测试的时间应该是前一个测试的大约两倍(还要记住,在短时间内测量可能不准确)。

关于c++ - 这个矩阵博览会代码是对数的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24756948/

相关文章:

c++ - 在 C++ 中从另一个对象初始化对象

c++ - 奇怪的 C++ 预处理器行为

arrays - 左/右旋转数组后最长递增子数组的长度

string - 近似字符串匹配的具体算法代码

c++ - WinAPI - C++ - 如何完全删除/清除窗口中的所有内容?

c++ - 重新定义错误

algorithm - 为什么我们需要检测链表中的循环

algorithm - 嵌套循环的时间复杂度,其中 k < j < i < n

algorithm - 找到小于给定值的最大值的时间复杂度是多少?

javascript - 寻找所有可能和的时间复杂度