【问题标题】:What is the C++ Time complexity of % operator?% 运算符的 C++ 时间复杂度是多少?
【发布时间】:2020-02-03 02:04:01
【问题描述】:

例如:

a = 10 ^ 12, b = 93 ^ 7
result = b % a

那么'%'算子的大O符号的时间复杂度是多少,如何计算?

【问题讨论】:

  • stackoverflow.com/questions/4361979/…,虽然 gcc 现在似乎只使用 DIV godbolt.org/z/0IKsjr
  • 取模的大O?那肯定是 O(1),这里的数据可能取决于什么?
  • @AlanBirtles 您链接的 SO 问题使用编译时常量,它解释了与您的 Compiler Explorer 示例的区别。
  • a、b 和结果的类型?
  • 对于基本数据类型它的 O(1) 但对于 bignums 它取决于使用的除法算法...

标签: c++ math modulo computation


【解决方案1】:

Big-O 表示法可能是考虑% 运算符时间复杂度的错误方法。从根本上说,大 O 表示法测量了随着输入变得越来越大,某些数量增长的速率。但是,内置的% 运算符仅适用于原始整数类型,并且这些类型在特定大小(例如,64 位)时最大。因此,通过说“% 的成本如何作为输入大小的函数?”来衡量复杂性。可能不是量化性能的正确方法。如果您确实想以这种方式量化事物,答案将是“O(1)”,因为计算两个整数的模需要一定的最大时间。

您可能还想研究另外两个问题。第一个是与其他操作(如加法、减法等)相比,执行取模需要多长时间。?这个答案因平台而异,但通常模数比加法或减法要慢得多。第二个是当两个整数可以任意大时,修改两个整数的大 O 成本是多少?这永远不会比进行除法、乘法和减法的成本更糟糕,因为你总是可以计算a - b * (a / b)。这样做的成本通常是logarithmically slower than just doing a multiplication

希望这会有所帮助!

【讨论】:

  • ...除非您正在处理某种大整数类型,否则您可以有意义地讨论(例如)一千位数字与一百万位数字的时间。
  • @JerryCoffin 哦,当然。这是我希望在第二段中解决的问题。
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 2020-01-26
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多