УДК 004.623
Вестник СПбГУ. Сер. 1. 2012. Вып. 3
ОБОБЩЕННЫЕ ка-ДЕРЕВЬЯ И ЛОКАЛЬНЫЕ ПРЕОБРАЗОВАНИЯ*
H. А. Лебединская1, Д. М. Лебединский
I. С.-Петербургский государственный университет, канд. физ.-мат. наук, доцент, nlebedin@math.spbu.ru
2. С.-Петербургский государственный университет, канд. физ.-мат. наук, доцент, dlebedinski@gmail.com
Введение. Задача об организации словаря — одна из классических задач дискретной математики. Известно несколько ее решений — например, АВЛ-деревья [1] или красно-черные деревья [2]. Однако в многомерном случае задача резко усложняется. Имеется несколько попыток приблизиться к ее решению, одна из наиболее удачных — так называемые к^-деревья [3].
Одним из преимуществ деревьев двоичного поиска является возможность преобразовать одно дерево в любое другое с тем же набором ключей при помощи локальных преобразований (так называемые повороты). Однако для к^деревьев это уже не так.
Чтобы обойти эту трудность, был предложен подход к(й-деревьев [4]. Суть его в том, что мы перебалансируем не все дерево, а лишь поддеревья небольшой высоты (так называемая бахрома).
Далее, этот подход был обобщен до так называемых gkd-деревьев [5]. Они сочетают в себе возможности kdt-деревьев с хранением нескольких ключей в одной вершине.
В данной статье исследуется некоторое обобщение понятия kd-дерева, допускающее локальные преобразования в узлах любой высоты, причем теорема о преобразовании дерева любой структуры в любое другое с теми же ключами при помощи локальных преобразований сохраняется.
Обобщенные ка-деревья и их локальные преобразования. В классических kd-деревьях номера координат, по значению которых идет ветвление, меняются циклически с ростом глубины узла. Обобщение состоит в том, чтобы разрешить использовать в каждом узле в качестве разделяющей любую плоскость, параллельную одной из координатных плоскостей; в том числе, допускается, чтобы такие разделяющие плоскости в соседних по вертикали узлах (отец и сын) были параллельны.
Теперь опишем локальные преобразования таких обобщенных деревьев. К сожалению, эти преобразования в конкретном узле не всегда применимы. Для их описания нам понадобится рассмотреть три случая.
Первый случай имеет место, если в отце и сыне разделяющие плоскости параллельны. В этом случае преобразование — это просто самый обычный поворот, унаследованный от одномерных деревьев двоичного поиска. После такого преобразования новая разделяющая плоскость в отце берется из его сына, а старая уходит в другого из его сыновей.
Второй случай имеет место, если в обоих сыновьях одного отца разделяющие плоскости совпадают, и эта плоскость не параллельна разделяющей плоскости отца.
* Работа выполнена при частичной финансовой поддержке РФФИ (гранты №10-01-00-245 и 1001-00-297).
© Н. А. Лебединская, Д. М. Лебединский, 2012
Тогда обе плоскости в отце и сыновьях разделяют все пространство на 4 части, которые перекомпоновываются таким образом, чтобы новая плоскость в отце бралась из сыновей, а старая опускалась в оба сына.
Третий случай имеет место тогда, когда в дереве всего один ключ. Тогда, очевидно, разделяющую плоскость можно выбрать произвольно.
Основная теорема
Теорема 1. Любое дерево рассматриваемого в статье типа может быть преобразовано в любое другое с тем же набором ключей при помощи локальных преобразований описанного в предыдущем разделе вида.
Доказательство. Очевидно, структура интересующего нас дерева (при фиксированном наборе ключей) полностью определяется заданием разделяющих плоскостей в его вершинах. Поэтому для доказательства теоремы нам достаточно доказать следующее утверждение: каковы бы ни были дерево и плоскость, при помощи локальных преобразований указанного вида можно добиться того, чтобы данная плоскость была разделяющей в корне нового дерева.
Доказательство последнего утверждения будем вести индукцией по высоте дерева. База индукции совершенно очевидна (см. третий случай в описании локальных преобразований).
Пусть теперь утверждение верно для деревьев высоты n, т. е. каково бы ни было дерево высоты не более n, при помощи локальных преобразований можно получить в корне такого дерева любую разделяющую плоскость.
Пусть также у нас имеется дерево высоты n +1 и плоскость P, которую мы хотим видеть в качестве разделяющей в его корне. Покажем, как этого добиться.
Рассмотрим два случая. Первый из них имеет место, если новая плоскость параллельна старой. В этом случае при помощи индукционного предположения (а оно применимо к сыновьям корня, поскольку их высота не больше n) добьемся того, чтобы новая плоскость стала разделяющей в сыне корня, лежащего по ту же сторону относительно старой разделяющей плоскости в корне, что и новая плоскость. Для завершения преобразования дерева достаточно теперь применить поворот в корне.
Второй случай имеет место, если новая плоскость не параллельна старой. В этом случае сначала добьемся того, чтобы новая плоскость стала разделяющей в обоих сыновьях корня. Ну а затем выполним преобразование второго типа.
Литература
1. Адельсон-Вельский Г. М., Ландис Е. М. Один алгоритм организации информации Ц Доклады Академии Наук. 1962. T. 146. Вып. 2. С. 263-266.
2. Bayer R. Symmetric Binary B-Trees: Data Structure and Maintenance Algorithms ll Acta Inf. 1972. Т. 1. С. 290-306.
3. Bentley J. L. Multidimensional Binary Search Trees Used for Associative Searching ll Comm. ACM. 1975. Т. 1S. С. 509-517.
4. Cunto W., Lau G., Flajolet P. Analysis of KDT-trees: KD-trees improved by local reorganisations ll Lecture Notes in Computer Science. 19S9. Т. 3S2. С. 24-3S.
5. Cunto W., Yriarte V. G KD-trees: Binary Trees that Combine Multi-dimensional Data Handling, Node Size and Fringe Reorganization ll Lecture Notes in Computer Science. 1992. Т. 621. С. 192-211.
Статья поступила в редакцию 26 апреля 2012 г.