【问题标题】:How can an AVL tree have a complexity of O(log n) when the in-order traversal calls itself recursively twice? Doesn't that make it O(2^n)?当中序遍历递归调用自身两次时,AVL 树的复杂度怎么可能达到 O(log n)?这不是 O(2^n) 吗?
【发布时间】:2020-10-18 05:11:47
【问题描述】:

我有一个保存播放器对象的 AVL 树。每个玩家都有一个名字和一个等级。树节点是根据玩家等级排序的。我首先遍历树的深度,并将每个节点附加到按等级排序的玩家列表中(按降序排列,因此从右到左遍历)。

我读到的所有内容都告诉我,AVL 树的复杂度为 O(log n),但是当我查看我的中序遍历函数时,我注意到它递归调用自身两次,我认为这会使它成为 O(2 ^n)。有没有更有效的方法来遍历我不知道的树?还是我的大 O 计算有误?

def traverseRightToLeft(node, array = []):
# Base case
if node is None:
    return
# Recursively check if there are any right child nodes, append the current node data to the list then recursively check if there are any left child nodes
else:
    traverseRightToLeft(node.right, array)
    array.append(node.data)
    traverseRightToLeft(node.left, array)
return array

【问题讨论】:

  • O(log n) 通常与单个项目树搜索有关。您正在遍历整棵树。
  • Usain Bolt 可以在 10 秒内跑完 100m,但那段时间他肯定跑不了马拉松。没有数据结构的时间复杂度,只有你可以用它做的每一件事的时间复杂度。

标签: python time-complexity big-o


【解决方案1】:

n 定义为树中的节点数。

SearchInsertErase 等操作在 AVL 树中是 O(log n)

遍历一棵树是O(n),不管它是AVL树、B-Tree还是红黑树,因为你在每个节点中只递归一次(父节点的调用或初始调用根)。

【讨论】:

    【解决方案2】:

    您的错误是“递归调用自己两次使算法 O(2^n)”的陈述。这不是真的。该算法在其大小的一半上递归地调用自身。

    想象一下我想数 n 块。我只能数 n 块。或者我可以将它们分成大致相等的两组,然后数左侧,然后数右侧并相加。如果左侧或右侧太大,我可以递归地将它们中的一个(或两个)分成两半,然后分别计算大约四分之一。但我仍然只计算每个元素一次。

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2017-05-03
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2020-03-22
      相关资源
      最近更新 更多