俄罗斯农民乘法算法的时间复杂度.

Time complexity of russian peasant multiplication algorithm?

本文关键字:时间复杂度 算法 农民 俄罗斯      更新时间:2023-10-16

我想知道这段代码的时间复杂度是多少,这是俄罗斯农民实现

unsigned long long int russian(unsigned long long int a, unsigned long long int b) {
    unsigned long long int res = 0;
     while (b > 0) {
        if (b & 1)
            res = res + a;
        a <<= 1;
        b >>= 1;
    }
    return res % mod;
}

据我所知,我认为它的时间复杂度是 lg2blg2a(取决于我们对 ab 的选择(。任何专家评论?

您提供的代码段的时间复杂度当然是O(1)的,因为对于任何输入,它可能需要多长时间是有上限的,并且永远不会超过该上限。

据推测,这不是您真正想问的问题的答案。实际上,您可能真正感兴趣的几种不同的东西,它们实际上都有不同的答案。

(另外,由于您似乎正在尝试进行模块化乘法,因此您确实应该减少循环中的所有相关数量,以免溢出,并且可以使用-而不是%(


您可能有兴趣精确估计挂钟时间。获得这个实际上需要收集一些经验数据,但它可能看起来像

A + B bitlength(b) + C popcount(b)

(popcount是二进制展开中的1个数(对于某些常量ABC。然而,CPU硬件实际上相当复杂,实际上可能非常复杂地获得上述第三项的良好估计,因为分支预测硬件可能会做一些奇怪的事情。

ABC可能甚至不是常量;它们在某种程度上取决于这个函数是否被内联,以及使用它的地方周围的代码类型。


现在,您可能想要一个更抽象的答案,其中b可以是任意大小,而不是限制为unsigned long long的大小,并且想要计算算术运算的次数。这显然只是 b 的位长度,或者如注释所示,O(lg(b)) .(其中lg是日志基数 2(


现在,您可能不仅对算术运算感兴趣,而且对它们的成本感兴趣。并且可能对任意大小的a感兴趣,而不是被限制为unsigned long long。一个有用的度量单位是位运算。例如,对 N 位数字进行左移 1 应该需要花费 O(N) 位操作。

我很确定循环可以O(lg(a)lg(b)+lg(b)^2)位操作。(这不包括您之后执行的%操作(