【问题标题】:"Big O" of this power-of-2 function这个 2 次方函数的“大 O”
【发布时间】:2016-01-19 05:10:07
【问题描述】:

以下函数的“大 O”是什么?我的假设是它是 O(log(n)) 但我想仔细检查一下。该函数只是确定它的参数是否是 2 的幂。

def pow_of_2(x):
    a = math.log(x, 2)
    if a == math.floor(a):
       return True
    else:
       return False

【问题讨论】:

  • 这似乎是O(1),因为它进行了固定计算,然后返回TrueFalse
  • 但计算不是基于 x @TimBiegeleisen 的变量
  • 函数是 O(log(x)) (因为将 x 转换为 double 是 O(log x)),而且对于大 x 也会产生错误的结果。例如,pow_of_2(2 ** 1000) 返回 False。
  • 我认为您对运行时间分析感到困惑。该函数只是计算一个日志然后返回。这是一个持续的惩罚。如果你有一个循环,或者其他类型的结构,那么运行时间就不会是恒定的。
  • 我和蒂姆在一起。 O(1)。它是其他任何东西都没有任何意义,因为问题中没有任何东西是“n”。有一个标量变量 (x),你只能用它做固定数量的操作(不管 "x" 有什么值)。

标签: python time-complexity big-o


【解决方案1】:

函数的 Big-O 不是常数时间。

函数的 Big-O 将与函数 math.log 的 Big-O 相同。这基本上取决于功能的实现。 (math.floor函数可以在常数时间内实现)。

log 函数通常使用泰勒级数展开计算,为O(M(n) * n^0.5),其中M(n) 是两个 n 位数字相乘的复杂度。

有关这方面的更多信息,请查看link

注意:如果你想检查一个数字是否是2的幂,你需要做的就是用二进制算术进行下面的检查

def pow_of_2(x): 返回 ((x & (x - 1)) == 0)

基本上,您需要检查二进制表示中是否恰好有一位设置为1。更详细的解释是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2021-03-04
    • 2018-07-16
    • 2019-03-11
    • 2021-11-20
    相关资源
    最近更新 更多