М-арное дерево - M-ary tree

Пример м-арного дерева с м = 5

В теория графов, м-арное дерево (также известен как k-ари или же k-путь дерево) является укорененным дерево в котором каждый узел имеет не более м дети. А двоичное дерево это частный случай, когдам = 2, а тройное дерево другой случай с м = 3 это ограничивает количество его детей тремя.

Виды м-арные деревья

  • А полный м-арное дерево является м-арное дерево, где на каждом уровне каждый узел имеет либо 0, либо м дети.
  • А полный м-арное дерево является м-арное дерево, максимально занимающее пространство. Он должен быть полностью заполнен на всех уровнях, кроме последнего. Однако, если последний уровень не завершен, все узлы дерева должны быть «как можно дальше слева».[1]
  • А идеально м-арное дерево это полный[1] м-арное дерево, в котором все листовые узлы находятся на одной глубине.[2]

Свойства м-арные деревья

  • Для м-арное дерево с высотой час, верхняя граница максимального количества листьев равна .
  • Высота час из м-арное дерево не включает корневой узел, а дерево содержит только корневой узел, имеющий высоту 0.
  • Высота дерева равна максимальной глубине D любого узла в дереве.
  • Общее количество узлов в идеально м-арное дерево является , а высота час является
По определению Big-Ω максимальная глубина
  • Высота полной м-арное дерево с п узлы .
  • Общее количество возможных м-арное дерево с п узлы (что является Каталонский номер ) [3].

Методы обхода для м-арочные деревья

Прохождение м-арное дерево очень похоже на обход двоичного дерева. Обход предварительного порядка идет к родительскому, левому поддереву и правому поддереву, а для обхода пост-порядка - по левому поддереву, правому поддереву и родительскому узлу. Для обхода по порядку, поскольку на каждый узел приходится более двух дочерних элементов. м> 2, необходимо определить понятие оставили и верно поддеревья. Один из распространенных методов создания левых / правых поддеревьев - разделить список дочерних узлов на две группы. Определив заказ на м дочерние узлы, первые узлы будут составлять левое поддерево и узлы составят правильное поддерево.

Преобразовать м-арное дерево в двоичное дерево

Пример преобразования м-арного дерева в бинарное.м = 6

Использование массива для представления м-такое дерево неэффективно, поскольку большинство узлов в практических приложениях содержат менее м дети. В результате это приводит к разреженному массиву с большим неиспользуемым пространством в памяти. Преобразование произвольного м-Преобразование из обычного дерева в двоичное только увеличило бы высоту дерева на постоянный коэффициент и не повлияло бы на общую временную сложность наихудшего случая. Другими словами, поскольку .

Сначала мы связываем все непосредственные дочерние узлы данного родительского узла вместе, чтобы сформировать список ссылок. Затем мы сохраняем ссылку от родителя к первому (то есть самому левому) дочернему элементу и удаляем все остальные ссылки на остальные дочерние элементы. Мы повторяем этот процесс для всех потомков (если у них есть потомки), пока мы не обработаем все внутренние узлы и не повернем дерево на 45 градусов по часовой стрелке. Полученное дерево представляет собой желаемое двоичное дерево, полученное из заданного м-арное дерево.

Способы хранения м-арные деревья

Массивы

Пример хранения м-арного дерева с м = 3 в массиве

м-арные деревья могут также храниться в порядке ширины как неявная структура данных в массивы, а если дерево полное м-ary tree, этот метод не тратит впустую места. В этом компактном расположении, если узел имеет индекс я, это c-й потомок в диапазоне {1, ...,м} находится по индексу , а его родительский элемент (если есть) находится по индексу (при условии, что корень имеет нулевой индекс, что означает массив, начинающийся с 0). Этот метод выгоден благодаря более компактному хранению и лучшему местонахождение ссылки, особенно во время обхода предзаказа. Пространственная сложность этого метода составляет .

На основе указателя

Каждый узел будет иметь внутренний массив для хранения указателей на каждый из своих дети:

Реализация m-арного дерева на основе указателя, где m = 4.

По сравнению с реализацией на основе массивов этот метод реализации имеет более высокую пространственную сложность, чем .

Перечень м-арочные деревья

Перечисление всех возможных м-арные деревья полезны во многих дисциплинах как способ проверки гипотез или теорий. м-Объекты обычного дерева могут значительно упростить процесс генерации. Можно построить представление битовой последовательности используя поиск в глубину м-арное дерево с п узлы, указывающие наличие узла по данному индексу с использованием двоичных значений. Например, битовая последовательность х = 1110000100010001000 представляет собой 3-арное дерево с п = 6 узлы, как показано ниже.

3-арное дерево с битовой последовательностью 1110000100010001000 и простой нулевой последовательностью 004433

Проблема с этим представлением состоит в том, что перечисление всех битовых строк в лексикографическом порядке будет означать, что две последовательные строки могут представлять два дерева, которые лексикографически очень разные. Следовательно, перечисление двоичных строк не обязательно приведет к упорядоченной генерации всех м-арочные деревья.[4] Лучшее представление основано на целочисленной строке, которая указывает количество нулей между последовательными единицами, известном как Простая нулевая последовательность. - простая нулевая последовательность, соответствующая битовой последовательности куда j - количество нулей, необходимых в конце последовательности, чтобы строка имела соответствующую длину. Например, представляет собой простое представление нулевой последовательности на приведенном выше рисунке. Более компактное представление 00433 является , который называется нулевая последовательность, дублирующие базы которых не могут быть смежными. Это новое представление позволяет построить следующую допустимую последовательность в .Простая нулевая последовательность действительна, если

, то есть количество нулей в битовой последовательности м-ary дерево не может превышать общее количество нулевых указателей (то есть указателей без прикрепленных к ним дочерних узлов). Это суммирование накладывает ограничение на узлов, чтобы было место для добавления без создания недопустимой структуры (т.е. имеющей доступный нулевой указатель для присоединения к ней последнего узла).

В таблице ниже показан список всех допустимых простых нулевых последовательностей всех 3-арные деревья с 4 узлами:

Ternary tree table.png

Начиная с правого нижнего угла таблицы (т. Е. С "000"), есть опорный шаблон который управляет генерацией возможных упорядоченных деревьев от «000» до «006». Базовый шаблон для этой группы («00X») изображен ниже, где дополнительный узел добавляется в позиции, помеченные «x».

M-ary template generation.png

После того, как исчерпаны все возможные позиции в шаблоне магистрали, новый шаблон будет построен путем смещения 3-го узла на одну позицию вправо, как показано ниже, и такое же перечисление будет происходить до тех пор, пока не будут исчерпаны все возможные позиции, помеченные «X».

M-арный шаблон generation2.png

Возвращаясь к таблице перечисления всех м-арные деревья, где и , мы можем легко наблюдать очевидный скачок от «006» к «010», который можно тривиально объяснить алгоритмически, как показано ниже:

M-арный шаблон next.png

Псевдокод для этого перечисления приведен ниже.[4]:

Процедура СЛЕДУЮЩИЙ()    если  для всех я тогда        законченный еще                        если я <п-1 тогда                    конец, если        за                 конец, есликонец

Беспетельное перечисление

Алгоритм генерации, который принимает время наихудшего случая называется без цикла, поскольку временная сложность не может включать цикл или рекурсию. Беспетельное перечисление м-Считается, что деревья не имеют циклов, если после инициализации они генерируют последовательные объекты дерева в . Для данного м-ари дерево Т с будучи одним из его узлов и это ребенок, а левое вращение в делается путем создания корневой узел, и делая и все его поддеревья являются дочерними элементами , дополнительно присваиваем оставил большинство детей к и самый правый ребенок остается привязанным к нему, пока повышается до root, как показано ниже:

Ltrotation.png
Преобразование м-арного дерева в левое дерево    за :        за :            пока t дочерний узел на глубине : L-t вращение в узлах на глубине i конец пока         конец для    конец для

А правое вращение в d является обратной этой операции. В левая цепь из Т это последовательность такие узлы, что это корень и все узлы, кроме иметь одного ребенка, подключенного к крайнему левому краю (т.е. ) указатель. Любой м-арное дерево можно преобразовать в левая цепь дерево с использованием последовательности конечных левый-t вращения за т из 2 к м. В частности, это можно сделать, выполнив вращение влево-t на каждом узле. пока все его поддерево стать ноль на каждой глубине. Затем последовательность из числа вращений влево-t, выполненных на глубине я обозначается определяет кодовое слово из м-дерево, которое можно восстановить, выполнив ту же последовательность вращений вправо.

Пусть кортеж представляют собой количество L-2 вращения, L-3 вращения, ..., L-m поворотов, произошедших в корне (т.е. i = 1). это количество L-t обороты необходимы на глубине я.

Регистрация количества поворотов влево на каждой глубине - это способ кодирования м-арное дерево. Таким образом, перечисление всех возможных законных кодировок поможет нам сгенерировать все м-арные деревья для данного м и п. Но не все последовательности м неотрицательные целые числа представляют действительное m-арное дерево. Последовательность неотрицательные целые числа - допустимое представление м-дерево тогда и только тогда, когда [5]

Лексикографически наименьшее представление кодового слова Мэри с п все узлы нули, а самый большой п-1 те, за которыми следуют м-1 ноль справа.

Инициализация    c [i] в ​​ноль для всех i от 1 до     p [i] установлен на  для i от 1 до n     Условия прекращения действия    Завершить, когда c [1] = n-1Процедура СЛЕДУЮЩИЙ [5]            если  тогда            конец, если            если  тогда            еще                    конец, есликонец

Заявление

Одно из приложений м-ary tree создает словарь для проверки допустимых строк. Для этого пусть м быть равным количеству допустимых алфавитов (например, количеству букв в английский алфавит ) с корнем дерева, представляющим начальную точку. Точно так же каждый из детей может иметь до м дочерние элементы, представляющие следующий возможный символ в строке. Таким образом, символы на путях могут представлять действительные ключи, отмечая конечный символ ключей как «конечный узел». Например, в приведенном ниже примере «at» и «и» являются допустимыми ключевыми строками с «t» и «d», отмеченными как конечные узлы. Терминальные узлы могут хранить дополнительную информацию, которая будет связана с данным ключом. Есть аналогичные способы создания такого словаря с использованием B-дерево, Octree и / или три.

Dictionary.png

Смотрите также

Рекомендации

  1. ^ а б "Упорядоченные деревья". Получено 19 ноября 2012.
  2. ^ Блэк, Пол Э. (20 апреля 2011 г.). "идеальное к-арное дерево". Национальный институт стандартов и технологий США. Получено 10 октября 2011.
  3. ^ Грэм, Рональд Л .; Knuth, Donald E .; Паташник, Орен (1994). Конкретная математика: фонд компьютерных наук (2-е издание). AIP.
  4. ^ а б Baronaigien, Доминик Руланс ван (2000). «Генерация Карибских деревьев без петель». Журнал алгоритмов. 35 (1): 100–107. Дои:10.1006 / jagm.1999.1073.
  5. ^ а б Корш, Джеймс Ф (1994). «Беспетельная генерация k-арных древовидных последовательностей». Письма об обработке информации. Эльзевир. 52 (5): 243–247. Дои:10.1016/0020-0190(94)00149-9.
  • Сторер, Джеймс А. (2001). Введение в структуры данных и алгоритмы. Birkhäuser Boston. ISBN  3-7643-4253-6.

внешняя ссылка