Этюд для программистов

Dec 20, 2024 20:59

Возьмем простое B-tree какое-нибудь. Простое - в смысле не B*-tree, т. е. никаких переливаний ключей из одного узла в другой. Лучше B+-tree, чтобы совсем просто было.

Возникает вопрос: при лимитированной высоте (глубине) дерева, каково ожидаемое количество ключей, которое в него поместится? Этот вопрос не так прост, как кажется. Пусть наше дерево - B+tree32, т. е. максимальное количество элементов в узле - 31, а указателей на узлы следующего уровня, соответственно 32. И пусть мы вставляем в дерево ключи строго в порядке возрастания.

Тогда при глубине 1 (т. е. когда есть только корневой узел) в него поместится 31 элемент. При попытке добавить следующий элемент этот узел разделится на два, по 16 элементов в каждом, которые станут на 2-м уровне, а корневой узел будет содержать ссылки на эти новые два. (Ключ в нем будет равен значению "медианного" элемента; WLOG, скажем, 17-го из имеющихся 32).

При продолжении добавления левый из двух только что образованных узлов никогда больше не будет попадать в поле зрения, поэтому в нём так навсегда и останется только 16 элементов. Правый узел разделится надвое при добавлении 48-го элемента, в левом из двух вновь образованных тоже навсегда останется 16 элементов, и т.п.

Таким образом, получаемое дерево будет иметь коэффициент ветвления, более близкий к 16, а не к 32.

Третий уровень захочет образоваться, когда в корневом узле было 31 ссылка на узлы по 16 элементов в каждом, а последняя ссылка - на узел, в котором 31 элемент. При вставлении 32-го элемента в этот последний узел он захочет разделиться, для чего понадобится вставить ссылку в корневой узел, а там уже некуда, поэтому и он потребует разделения с образованием нового уровня дерева. Итого 31*16+31 = 527, а sqrt(527) < 23.

Аналогичный подсчет для 3 и более уровней даст каждый раз все более низкое значение.

Упражнение 1. Выведите формулу или напишите программу, которая находит ожидаемое количество элементов, помещающееся в дерево глубины k, при вставке элементов в случайном порядке.

Упражнение 2. Найдите последовательность номеров элементов, заполняющую дерево глубины k "под завязку".

Ответов я не знаю, и https://cs.stackexchange.com/ похоже, тоже не знает. Задавать настолько умные вопросы LLM-ам - только время терять.

puzzle

Previous post Next post
Up