Итак, давайте предположим, что мы строим дерево следующим образом: учитывая n узлов, возьмем f (n) узлов и отложим их в сторону. Затем создайте дерево, построив идеальное двоичное дерево, в котором корень имеет левое поддерево, представляющее собой идеальное двоичное дерево из n - f (n) - 1 узлов, и правое поддерево, представляющее собой цепочку длиной f (n). Мы выберем f (n) позже.
Так какова средняя глубина дерева? Поскольку мы просто хотим получить асимптотическую оценку, давайте выберем n так, чтобы n - f (n) - 1 было на единицу меньше идеальной степени двух, скажем, 2 ^ k - 1. В этом случае сумма высот в этом часть дерева равна 1 * 2 + 2 * 3 + 4 * 4 + 8 * 5 + ... + 2 ^ (k-1) * k, что составляет (IIRC) около k 2 ^ k, что составляет примерно (n - f (n)) log (n - f (n)) по нашему выбору k. В другой части дерева общая глубина составляет около f (n) ^ 2. Это означает, что средняя длина пути составляет около ((n - f (n)) log (n - f (n)) + f (n) ^ 2) / n. Кроме того, высота дерева f (n). Поэтому мы хотим максимизировать f (n) при сохранении средней глубины O (log n).
Для этого нам нужно найти f (n) такое, что
- n - f (n) = & Theta; (n), или логарифм в числителе исчезает, а высота не является логарифмической,
- f (n) ^ 2 / n = O (log n), или второй член в числителе становится слишком большим.
Если вы выберете f (n) = & Theta; (sqrt (n log n)), я думаю, что 1 и 2 удовлетворены максимально. Так что я бы поспорил (хотя я мог быть совершенно неправ в этом), что это так хорошо, как вы можете получить. Вы получаете дерево высоты & Theta; (sqrt (n log n)), которое имеет среднюю глубину & Theta; (Log n).
Надеюсь, это поможет! Если моя математика далеко, пожалуйста, дайте мне знать. Сейчас уже поздно, и я не сделал свою обычную двойную проверку. : -)