ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2025

Просмотров: 4032

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Алгоритмы на деревьях Сортировка с прохождением бинарного дерева

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

Дерево строится по следующим принципам (рис. 6.15). В качестве корня создается узел, в который записывается первый элемент массива. Для каждого очередного элемента создается новый лист. Если элемент меньше значения в текущем узле, то для него выбирается левое поддерево, если больше или равен – правое. Для создания очередного узла происходят сравнения элемента со значениями существующих узлов, начиная с корня.

Исходный массив:

14,15,4,9,7,18,3,5,16,4,20,17,9,14,5

Прохождение в симметричном порядке:

3,4,4,5,5,7,9,9,14,14,15,16,17,18,20


Рис. 6.15. Сортировка по возрастанию с прохождением бинарного дерева.

Сортировка методом турнира с выбыванием

Приведем другой алгоритм сортировки, основанный на использовании бинарных деревьев. Данный метод получил название турнира с выбыванием. Пусть имеется исходный массив 10, 20, 3, 1, 5, 0, 4, 8. Сортировка начинается с создания листьев дерева. В качестве листьев бинарного дерева создаются узлы, в которых записаны значения элементов исходного массива. Дерево строится от листьев к корню. Для двух соседних узлов строится общий предок, до тех пор, пока не будет создан корень. В узел-предок заносится значение, являющееся наименьшим из значений в узлах-потомках.

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

После этого происходит повторное занесение значений в родительские элементы от листьев к корню. При сравнениях специальный символ считается большим по отношению к любому другому значению. После повторного заполнения из корня извлекается очередной элемент и итерация повторяется. Извлечения элементов продолжаются до тех пор, пока в дереве не останутся одни специальные символы. В результате получим отсортированный массив 0, 1, 3, 4, 5, 8, 10, 20. Описанный алгоритм иллюстрируют рис. 6.16-6.19.

0


Рис. 6.16. Построение дерева сортировки.

0

Рис. 6.17. Замена извлекаемого элемента на специальный символ

Рис. 6.18. Повторное заполнение дерева сортировки.


0,1,3,4,5,8,10,20

0,1,3,4,5,8,10,20


Рис. 6.19. Извлечения элементов из дерева сортировки.

Применение бинарных деревьев для сжатия информации

Бинарные деревья применяются в задачах сжатия информации. Рассмотрим пример. Имеется текстовая строка S, состоящая из 10 символов S = ABCCCDDDDD. При кодировании одного символа одним байтом для строки потребуется 10 байт. Попробуем сократить требуемую память. Рассмотрим, какие символы действительно требуется кодировать. В данной строке используются всего 4 символа. Поэтому можно использовать укороченный код.

A 00

B 01

C 10

D 11

b = 00011010101111111111 (20 бит)

В данном случае мы проанализировали текст на предмет использования символов. Можно заметить, что различные символы имеют различную частоту повторения. Существующие методы кодирования позволяют использовать этот факт для уменьшения длины кода. Одним из таких методов является кодирование Хаффмана. Он основан на использовании кодов различной длины для различных символов. Для максимально повторяющихся символов используют коды минимальной длины.

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

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

Символ Частота Код

D 5 0

C 3 10

A 1 110

B 1 111