AVL树,以下说法是否正确?大O

AVL tree, Is the following claim true? BIG O

我看到了以下声明:

令T为AVL树,TL为根的左子树中的节点数,而TR为根的右子树中的节点数。然后: TL = Big Theta (TR) 这两个意思是: TL = O(TR)TL = Big Omega (TR)

起初我虽然很简单是真的但是如果左儿子有0个节点而右儿子有1个节点怎么办?这仍然是一个合法的 avl 树,与声明相矛盾。

有人可以确认并看看我在这里做错了什么吗?

该说法是错误的,但这不是有效的证据。 1 确实不是 O(0);然而,这个事实是不相关的,因为定义所讨论序列的习惯方法是让 TL(n) 是根节点左侧的最大(对于 big-O)或最小(对于 big-Omega)节点数给定右子树有 n 个节点的子树。由于 AVL 平衡 属性,一棵有效的 AVL 树不可能有一个空的左子树和一个以上的节点,所以这个退化的例子不是我们需要推理的无限族渐近行为。

f(n) = O(g(n)) 的量词结构是存在 n0 和 c 使得对于所有 n ≥ n0,我们有 f(n) ≤ c g(n)。当我们否定这个陈述时,量词翻转,所以对于所有 n0和c,存在n≥n0 使得 f(n) > c g(n)。如果我们取 n0 大,那么它排除了你的例子。

AVL 树的良构要求是每个子树都是±1 高度平衡的。在最极端的情况下,左子树的高度为 k+1,而右子树的节点最少,高度为 k。我们得到递归数TL(k),高度为k

的完整子树中的节点数
TL(0) = 1
TL(k+1) = 2 TL(k) + 1,

求解 TL(k) = 2^(k+1) - 1TR(k),高度为 k

的最小 AVL 树中的节点数
TR(0) = 1
TR(1) = 2
TR(k+1) = TR(k) + TR(k-1) + 1,

求解为 TL(k) = Fib(k+1) - 1,即 O(1.7^k),因此不是 Omega(2^k)

声明不正确。为了反驳这个说法,你的反例确实足够了,因为 1 is not O(0):

不能有任何(常数)c
1 <= c * 0.

请注意,要证明这一说法,必须同时确保两者

TL = O(TR) and TR = O(TL)

不管 TLTR 是什么(只要它们是有效 AVL 树中的可能数字)。 当前接受的答案具有误导性。请注意,要证明该声明是错误的,不需要证据。 请注意,原始问题中的声明并未说明等式适用于 足够大 有效的 TL 和 TR。相反,它指出等式适用于 any 有效的 TL 和 TR。这就是问题的作者 MrCalc 寻求对他的反例进行确认的原因。这是我的确认:

MrCalc's counterexample TL=0 and TR=1 indeed disproves the claim.

我不同意当前接受的答案中关于不等式 1 is not O(0) 无关紧要的说法。 相反,这是原问题中提出的一个关键点,不等式确实反驳了这一说法。