俄罗斯农民乘法算法的时间复杂度.
Time complexity of russian peasant multiplication algorithm?
我想知道这段代码的时间复杂度是多少,这是俄罗斯农民实现
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;
}
据我所知,我认为它的时间复杂度是 lg2b 或 lg2a(取决于我们对 a 或 b 的选择(。任何专家评论?
您提供的代码段的时间复杂度当然是O(1)
的,因为对于任何输入,它可能需要多长时间是有上限的,并且永远不会超过该上限。
据推测,这不是您真正想问的问题的答案。实际上,您可能真正感兴趣的几种不同的东西,它们实际上都有不同的答案。
(另外,由于您似乎正在尝试进行模块化乘法,因此您确实应该减少循环中的所有相关数量,以免溢出,并且可以使用-
而不是%
(
您可能有兴趣精确估计挂钟时间。获得这个实际上需要收集一些经验数据,但它可能看起来像
A + B bitlength(b) + C popcount(b)
(popcount
是二进制展开中的1
个数(对于某些常量A
、B
和C
。然而,CPU硬件实际上相当复杂,实际上可能非常复杂地获得上述第三项的良好估计,因为分支预测硬件可能会做一些奇怪的事情。
A
、B
和C
可能甚至不是常量;它们在某种程度上取决于这个函数是否被内联,以及使用它的地方周围的代码类型。
现在,您可能想要一个更抽象的答案,其中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)
位操作。(这不包括您之后执行的%
操作(
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 如何降低 c++ 中算法的时间复杂度?
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 三和算法的时间复杂度是多少
- 关于算法的时间复杂度
- 迭代算法的时间复杂度
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 这个算法的时间复杂度是多少
- 俄罗斯农民乘法算法的时间复杂度.
- 具有随机分量的算法的时间复杂度(吉莱斯皮算法)
- 编写算法以查找数组中最常出现的元素.给出算法的时间复杂度
- C++中strstr()函数的时间复杂度、空间复杂度和算法是什么
- 这种算法解决数独的时间复杂度是多少?
- 查找所有唯一二叉搜索树的算法的时间复杂度是多少?
- 二叉树之字形水平阶遍历的这种算法的时间复杂度是多少?
- 回文分区的这种算法的时间复杂度是多少?
- 这个算法获取所有单词梯的时间复杂度是多少?
- 此算法查找所有路径总和的时间复杂度是多少?
- 如何计算最小公元算法的时间复杂度?