Итак, давайте предположим, что мы строим дерево таким образом: даны 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) = (n), или логарифмический член в числителе исчезает и высота не является логарифмической,
- f(n)^2/n = O(log n), или второй член в числителе становится слишком большим.
Если вы выберете f (n) = (sqrt (n log n)), я думаю, что 1 и 2 удовлетворяются максимально. Так что я готов поспорить (хотя я могу ошибаться в этом), что это настолько хорошо, насколько это возможно. Вы получаете дерево высотой (sqrt(n log n)), которое имеет среднюю глубину (Log n).
Надеюсь это поможет! Если моя математика далеко, пожалуйста, дайте мне знать. Уже поздно, и я не сделал свою обычную перепроверку. :-)
person
templatetypedef
schedule
13.02.2012
w
вы имеете в видуω
(маленькая буква Омега), верно? - person Gumbo   schedule 13.02.2012