Big o 为什么这个算法是O(n^2)

Big o 为什么这个算法是O(n^2),big-o,Big O,正如我在问题中所说的,为什么这个函数是O(n^2)?这是本书中对上述示例的解释: 它必须在n次递归调用后终止,因为每次调用时y减半,即其位数减少1。每个递归调用都需要以下操作:2除(右移);奇数/偶数测试(查找最后一位);2的乘法(左移位);可能还有一个加法,总共是O(n)位操作。因此,所花费的总时间是O(n^2),与之前一样 由于2除和乘法的左移位和右移位,我认为它会大于O(n^2)…可能是n^3。右移位、测试、左移位的每一个操作每一位都需要固定的时间,所以每次递归都要做O(n)次。记住O(3

正如我在问题中所说的,为什么这个函数是O(n^2)?这是本书中对上述示例的解释:

它必须在n次递归调用后终止,因为每次调用时y减半,即其位数减少1。每个递归调用都需要以下操作:2除(右移);奇数/偶数测试(查找最后一位);2的乘法(左移位);可能还有一个加法,总共是O(n)位操作。因此,所花费的总时间是O(n^2),与之前一样


由于2除和乘法的左移位和右移位,我认为它会大于O(n^2)…可能是n^3。

右移位、测试、左移位的每一个操作每一位都需要固定的时间,所以每次递归都要做O(n)次。记住O(3n)仍然是O(n)


由于使用左移位将整个函数递归地应用于每个位,因此之前的O(n)步骤执行O(n)次,总复杂度为O(n^2)。

这是一本comp sci教科书还是一本VLSI教科书?因为答案取决于运算的复杂度y==0、y/2、2z、x+2z和“y是偶数”

作为应用程序开发人员,我认为它们是常数时间操作,所以它们都是O(1)。乘法函数是O(log(Y))或O(N),其中N是Y中的位数。同样的事情。因此,我得出结论,整个函数是O(N)

现在,计算机工程师可能会争辩说y/2需要移位N位,因此这是一个O(N)操作。可能有一些CPU就是这样工作的。请允许我荒谬地说一句,我可以为y==0创建一个取O(N^47)的实现,因此这个函数就是O(N^48)。:-)


实际上,任何现代的N位处理器都会并行地进行N位数字的位移位,所以它们实际上是O(1)。也许在8088上不是这样,但对于任何现代设计来说都是如此。因此,在实践中,我认为这是O(N)而不是O(N^2)

我认为这本书讨论的是时间复杂性——基于迭代次数或递归深度。这通常被认为是与每个步骤中完成的工作分开的。谢谢!这就解释了,没问题。请注意,正如Moby Disk所说,这个示例有点做作。虽然你书中的解释是有道理的,但实际上对于现代处理器来说,大多数位运算实际上都是O(1)。
function multiply(x, y)
  Input: Two n-bit integers x and y, where y ≥ 0 Output: Their product
  if y=0: return 0 
  z = multiply(x, ⌊y/2⌋) 
  if y is even:
    return 2z 
  else:
    return x + 2z