Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по МОТС / ДИСКРЕТНАЯ МАТЕМАТИКА Графы.doc
Скачиваний:
377
Добавлен:
15.02.2014
Размер:
3.38 Mб
Скачать

9.3.4. Алгоритм симметричного обхода бинарного дерева

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

Алгоритм 9.1. Алгоритм симметричного обхода бинарного дерева

Вход: бинарное дерево, представленное списочной структурой, r — указатель на корень. Выход: последовательность узлов бинарного дерева в порядке симметричного обхода.

Т: = ; р: = r { вначале стек пуст и р указывает на корень дерева }

М : { анализирует узел, на который указывает р }

if р = nil then

if T = 0 then

stop { обход акончен }

end if

р  Т { левое поддерево обойдено }

yield р { очередной узел при симметричном обходе }

р:=р.r { начинаем обход правого поддерева

else

р  Т { запоминаем текущий узел ... }

р:=р.l { ... и начинаем обход левого поддерева }

end if

goto M

9.4. Деревья сортировки

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

9.4.1. Ассоциативная память

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

Пример

Ассоциативная память используется во многих областях жизни.

1. Толковый словарь или энциклопедия: записью является словарная статья, а ключом — заголовок словарной статьи (обычно его выделяют жирным шриф­том).

2. Адресная книга: ключом является имя абонента, а записью — адресная инфор­мация (телефон(ы), почтовый адрес и т. д.).

3. Банковские счета: ключом является номер счета, а записью — финансовая информация (которая может быть очень сложной).

Таким образом, ассоциативная память должна поддерживать по меньшей мере три основные операции:

- добавить (ключ, запись);

- найти (ключ): запись;

- удалить (ключ).

Эффективность каждой операции зависит от структуры данных, используемой для представления ассоциативной памяти. Эффективность ассоциативной памя­ти в целом зависит от соотношения частоты выполнения различных операций в данной конкретной программе.

ЗАМЕЧАНИЕ

Таким образом, невозможно указать способ организации ассоциативной памяти, который оказался бы наилучшим во всех возможных случаях.

9.4.2. Способы реализации ассоциативной памяти

Для представления ассоциативной памяти используются следующие основные структуры данных:

  1. неупорядоченный массив;

  2. упорядоченный массив;

  3. дерево сортировки — бинарное дерево, каждый узел которого содержит ключ и обладает следующим свойством: значения ключа во всех узлах левого под­дерева меньше, а во всех узлах правого поддерева больше, чем значение ключа в узле;

  4. таблица расстановки (или хэш-таблица).

При использовании неупорядоченного массива алгоритмы реализации операций ассоциативной памяти очевидны:

  1. операция «добавить (ключ, запись)» реализуется добавлением записи в конец массива;

  2. операция «найти (ключ): запись» реализуется проверкой в цикле всех записей в массиве;

  3. операция «удалить (ключ)» реализуется поиском удаляемой записи, а затем перемещением всех последующих записей на одну позицию вперед.

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

Основное внимание в этом разделе уделено алгоритмам выполнения операций с деревом сортировки.

ОТСТУПЛЕНИЕ

Таблицы расстановки являются чрезвычайно важным практическим приемом программи­рования, подробное описание которого выходит за рамки этого учебника. Вкратце основ­ная идея заключается в следующем. Подбирается специальная функция, которая называ­ется хэш-функцией, переводящая значение ключа в адрес хранения записи (адресом может быть индекс в массиве, номер кластера на диске и т. д.). Таким образом, имея ключ, с по­мощью хэш-функции сразу определяется место хранения записи и открывается доступ к ней. Хэш-функция подбирается таким образом, чтобы разным ключам соответствовали, по возможности, разные адреса из диапазона возможных адресов записей. Как правило, мощ­ность множества ключей существенно больше размера пространства адресов, которое, в свою очередь, больше количества одновременно хранимых записей. Поэтому при исполь­зовании хэширования возможны коллизии — ситуации, когда хэш-функция сопоставляет один и тот же адрес двум актуальным записям с различными ключами. Различные мето­ды хэширования отличаются друг от друга способами разрешения коллизий и приемами вычисления хэш-функций.