algorithm - 递归模式的大 O 时间复杂度

标签 algorithm recursion time-complexity big-o

我对递归模式的运行时有疑问。

示例 1

int f(int n) {
  if(n <= 1) {
    return 1;
  }

  return f(n - 1) + f(n - 1);
}

我可以理解上面代码的运行时间是 O(2^N) 因为如果我传递 5,它会调用 4 两次然后每个 4 调用 3 两次并跟随直到它达到 1 即,像 O(branches^深度)。

示例 2 平衡二叉树

int sum(Node node) {
  if(node == null) {
    return 0;
  }

  return sum(node.left) + node.value + sum(node.right);
}

我读到上面代码的运行时间是 O(2^log N),因为它是平衡的,但我仍然认为它是 O(2^N)。谁能解释一下?

  1. 当元素数量每次减半时,运行时间为 log N。但是二叉树如何在这里工作?
  2. 2^log N 只是因为它是平衡的吗?
  3. 如果不平衡怎么办?

编辑: 我们可以解决 O(2^log N) = O(N) 但我认为它是 O(2^N)。

谢谢!

最佳答案

  • 二叉树与此处的任何其他树一样具有 O(n) 的复杂性,因为您最终要遍历树的所有元素。通过减半,除了分别计算相应 child 的总和外,我们没有做任何特别的事情。

  • 术语是这样来的,因为如果它是平衡的,那么 2^(log_2(n)) 是树中元素的数量(叶子+非叶子)。(log2(n) 级别)

  • 同样,如果它不平衡也没关系。我们正在执行一个操作,其中每个元素都需要考虑,使运行时间为 O(n)

它在哪里可能很重要?如果它正在搜索一个元素,那么它就很重要(无论它是否平衡)。

关于algorithm - 递归模式的大 O 时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47166611/

相关文章:

java - 我如何在不出现 OutOfMemoryError 的情况下存储 10,000 x 10,000 的二维数组?

algorithm - 如何找出合并排序实现的时间复杂度?

recursion - 迭代过程与递归过程

java - 递归 - 数字按相反顺序排列

python - python中的链表和递归

algorithm - 我们能证明提取中位数的算法必须对集合进行划分吗?

r - 查找一个向量中小于另一向量中元素的数量

java - 找到二叉树中节点数之间的最大比率

Java:从输入字符串数组生成 nCr 数组并返回它

algorithm - 求解一个未知数的方程,作为函数给出