Мы можем сделать B-дерево за один проход, но это может быть не оптимальный метод хранения. В зависимости от того, как часто вы выполняете последовательные запросы по сравнению с произвольным доступом, может быть лучше сохранить его в последовательности и использовать двоичный поиск для обслуживания запроса с произвольным доступом.
Это сказал: предположим, что каждая запись в вашем б дерево имеет (т - 1) ключи (м> 2, двоичный случай немного отличается). Мы хотим, чтобы все листья на одном уровне и все внутренние узлы имели не менее (м - 1)/2 ключей. Мы знаем, что полное b-дерево высоты k имеет (m^k - 1) ключей. Предположим, что у нас есть n ключей для хранения. Пусть k - наименьшее целое число, такое, что m^k - 1> n. Теперь, если 2 m^(k - 1) - 1 < n, мы можем полностью заполнить внутренние узлы и равномерно распределить остальные ключи на листовые узлы, причем каждый листовой узел получает либо пол, либо потолок (n + 1 - m^(k - 1))/m^(k - 1) ключей. Если мы не сможем этого сделать, то мы знаем, что нам достаточно заполнить все узлы на глубине k - 1 по крайней мере на полпути и сохранить один ключ в каждом из листьев.
Как только мы определили форму нашего дерева, нам нужно выполнить обход дерева по порядку, последовательно отбрасывая ключи в нужное положение.
Определите «оптимальный». – 2010-08-03 22:20:58