6.17. AVL 树性能

.. Copyright (C) Brad Miller, David Ranum This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/.

AVL Tree Performance ~~~~~~~~~~~~~~~~~~~~

Before we proceed any further let's look at the result of enforcing this new balance factor requirement. Our claim is that by ensuring that a tree always has a balance factor of -1, 0, or 1 we can get better Big-O performance of key operations. Let us start by thinking about how this balance condition changes the worst-case tree. There are two possibilities to consider, a left-heavy tree and a right-heavy tree. If we consider trees of heights 0, 1, 2, and 3, :ref:Figure 2 <fig_worstAVL> illustrates the most unbalanced left-heavy tree possible under the new rules.

.. _fig_worstAVL:

.. figure:: Figures/worstAVL.png :align: center

Figure 2: Worst-Case Left-Heavy AVL Trees

Looking at the total number of nodes in the tree we see that for a tree of height 0 there is 1 node, for a tree of height 1 there is :math:1 + 1 = 2 nodes, for a tree of height 2 there are :math:1 + 1 + 2 = 4, and for a tree of height 3 there are :math:1 + 2 + 4 = 7. More generally the pattern we see for the number of nodes in a tree of height :math:h (:math:N_h) is:

.. math::

N_h = 1 + N_{h-1} + N_{h-2}

This recurrence may look familiar to you because it is very similar to the Fibonacci sequence. We can use this fact to derive a formula for the height of an AVL tree given the number of nodes in the tree. Recall that for the Fibonacci sequence the :math:i^{th} Fibonacci number is given by:

.. math::

F_0 & = 0 \ F_1 & = 1 \ F_i & = F_{i-1} + F_{i-2} \text{ for all } i \ge 2

An important mathematical result is that as the numbers of the Fibonacci sequence get larger and larger the ratio of :math:F_i / F_{i-1} becomes closer and closer to approximating the golden ratio :math:\Phi which is defined as :math:\Phi = \frac{1 + \sqrt{5}}{2}. You can consult a math text if you want to see a derivation of the previous equation. We will simply use this equation to approximate :math:F_i as :math:F_i = \Phi^i/\sqrt{5}. If we make use of this approximation we can rewrite the equation for :math:N_h as:

.. math::

N_h = F_{h+3} - 1, h \ge 1

By replacing the Fibonacci reference with its golden ratio approximation we get:

.. math::

N_h = \frac{\Phi^{h+2}}{\sqrt{5}} - 1

If we rearrange the terms, take the base 2 log of both sides, and then solve for :math:h, we get the following derivation:

.. math::

\log{N_h+1} & = (h+2)\log{\Phi} - \frac{1}{2} \log{5} \ h & = \frac{\log{(N_h+1)} - 2 \log{\Phi} + \frac{1}{2} \log{5}}{\log{\Phi}} \ h & = 1.44 \log{N_h}

This derivation shows us that at any time the height of our AVL tree is equal to a constant (1.44) times the log of the number of nodes in the tree. This is great news for searching our AVL tree because it limits the search to :math:O(\log{n}).


最后更新: 2023年10月10日
创建日期: 2023年10月10日