
алгоритмы / Struktury
.pdf
Лекции по курсу «Структуры и алгоритмы компьютерной обработки данных»
семестр 3 Лектор: доцент кафедры ВМиК Верхотурова Галина Николаевна
Материал собрал и склеил Ф.Тимур специально для МО-202, декабрь, 2013

Структуры и алгоритмы компьютерной обработки данных |
2 |
Структуры и алгоритмы компьютерной обработки данных (СиАКОД) |
.................................................. 3 |
Алгоритмы.................................................................................................................................................. |
3 |
Абстрактные типы данных ....................................................................................................................... |
3 |
Коллекции с прямым доступом .................................................................................................................... |
5 |
Коллекции с индексным доступом............................................................................................................... |
5 |
Хеширование, хеш-функции, методы устранения коллизий................................................................. |
5 |
Хеш-функции ............................................................................................................................................. |
6 |
Методы устранения коллизий .................................................................................................................. |
7 |
Словарь ....................................................................................................................................................... |
8 |
Коллекции с последовательным доступом.................................................................................................. |
8 |
Список......................................................................................................................................................... |
8 |
Стек ............................................................................................................................................................. |
8 |
Очередь ....................................................................................................................................................... |
9 |
Дек ............................................................................................................................................................... |
9 |
Иерархические коллекции ............................................................................................................................ |
9 |
Дерево ......................................................................................................................................................... |
9 |
Бинарное дерево....................................................................................................................................... |
10 |
Структура двоичного дерева................................................................................................................... |
10 |
Рекурсивные методы прохождение деревьев........................................................................................ |
10 |
Идеально-сбалансированное дерево. ..................................................................................................... |
12 |
Бинарное поисковое дерево .................................................................................................................... |
12 |
Сбалансированное поисковое дерево. AVL – дерево........................................................................... |
13 |
Балансировка. ........................................................................................................................................... |
13 |
Включение вершины. .............................................................................................................................. |
13 |
Сильноветвящиеся деревья. B-Деревья. ................................................................................................ |
14 |
Графы ............................................................................................................................................................ |
17 |
О графах.................................................................................................................................................... |
17 |
Графы. ....................................................................................................................................................... |
17 |
Способы машинного представления графов. ........................................................................................ |
17 |
Проходы в графах. ................................................................................................................................... |
18 |
Поиск в глубину....................................................................................................................................... |
19 |
Поиск в ширину. ...................................................................................................................................... |
20 |
Анализ сложности алгоритмов поиска в глубину и в ширину. ........................................................... |
21 |
Эйлеров граф. ........................................................................................................................................... |
22 |
Алгоритм нахождения Эйлерова Цикла ................................................................................................ |
22 |
Остовные деревья .................................................................................................................................... |
23 |
Алгоритм Крускала.................................................................................................................................. |
24 |
Алгоритм Дейкстры для нахождения кратчайшего пути .................................................................... |
25 |

Структуры и алгоритмы компьютерной обработки данных |
3 |
|
|
Структуры и алгоритмы компьютерной обработки данных (СиАКОД)
Алгоритмы.
Процесс создания компьютерной программы для решения какой-либо практической задачи состоит из следующих этапов:
1) постановка задачи (внешний уровень предоставления данных)
Позволяет точно сформулировать и понять задачу, при этом в первую очередь необходимо установить имеет ли задача решение. Для этого необходимо определённые аспекты решаемой задачи выразить в терминах формальной модели и в рамках этой модели узнать существует ли методы и решения этой задачи. На этом этапе необходимо получить ответы на вопросы: Что дано? Достаточно ли исходных данных? Какие результаты должны быть получены? На этом этапе предметную область мы видим глазами пользователя специалиста этой области и соответственно данные представляются в понятиях и обозначениях этой области. Это внешний уровень представления данных. Для решения задачи на ЭВМ эти данные надо представить в машинном виде, т.е. на физическом уровне.
2) построение модели задачи
На этом этапе на данные начинают смотреть с учетом их обработки на машине, поэтому в разработке модели задачи должны участвовать специалисты предметной области и программисты. На этом этапе выделяется какая информация может быть написана, создана и обработана в программах.
3) разработка алгоритма решения задачи
Алгоритм – это правила, указывающие действия, в результате которых от исходных данных исполнители переходят к конечным результатам.
На этом этапе выделяются абстрактные типы данных, которые определяют структуру и область значений конкретных данных задачи и операции над этими данными.
4)написание, тестирование, отладка, документирование программы
Алгоритм, записанный на языке программирования называется программой
Вкаждом языке программирования имеются средства представления данных различных типов. Тип данных определяет какие значения могут принимать данные этого типа и допустимые операции над ними. Абстрактные типы данных получают программную реализацию. Это промежуточный уровень представления данных. Затем, в результате трансляции программы, данные представляются в виде последовательности битов. Это физический уровень представления данных.
5)проверка правильности алгоритма
6)анализ сложности алгоритмов.
Структуры данных и алгоритмы – основа современного компьютерного программирования. Структуры данных + Алгоритм = Программа.
Абстрактные типы данных
Решая любую задачу с помощью вычислительной машины или без нее необходимо выбрать уровень абстрагирования (упрощение фактов), т.е. определить множество данных, представляющих реальную ситуацию. Абстракция определяет область и структуру данных вместе с набором операций, которые имеют доступ к данным.
Абстракция, называемая абстрактным типом данных, создает определяемый пользователем тип данных, чьи операции указывают как пользователь или клиент может манипулировать этими данными.
Абстрактный тип данных - это математическая модель + различные операторы, определённые в рамках этой модели. Абстрактный тип данных является независимым от реализации и позволяет программисту сосредоточиться на идеализированных моделях данных и операциях над ними. Для реализации алгоритма в конкретном языке программирования необходимо найти способ представления абстрактного типа данных в терминах типах данных и операторов, поддерживаемых данным языком программирования. В языках программирования тип данных переменных обозначает множество значений, которые может принимать этот элемент.
Для представления абстрактного типа данных используют структуру данных, которые представляют собой набор переменных, возможно различных типов данных, объединенных, определённым образом.

Структуры и алгоритмы компьютерной обработки данных |
4 |
|
|
Каждая структура данных строится на основе базовых типов данных, применяемых в языках программирования, используя доступные в этом языке средства структурирования данных.
Каждую структуру данных можно представить в виде ( ), где – множество элементов данных, а – множество отношений между элементами данных.
К стандартным простейшим типам относятся типы, имеющиеся на большинстве вычислительных машин. Эти типы являются естественными для большинства языков программирования и объекты этих типов не могут быть разделены на меньшие части.
Набор базовых типов отличается в различных языках. Например, в языке паскаль это типы целых и действительных чисел, булев тип и символьный тип char. В языке си это числа, символы, указатели и определённые пользователем типы перечисления.
Структурированные типы данных имеют компоненты, построенные из простых типов по правилам, определяющим связи между компонентами. Правила конструирования составных типов данных на основе базовых типов также различаются в разных языках программирования.
Выделяют в структурах данных фундаментальные и усложненные структуры данных.
Фундаментальные структуры – это «молекулы», из которых строятся составные структуры. К фундаментальным структурам относятся: запись, массив фиксированного размера и множество. К ним можно отнести с некоторыми ограничениями последовательные файлы. Эти структурированные типы данных являются примером коллекции, которая сохраняет данные и предоставляет операции доступа: добавляющие, удаляющие или обновляющие элементы данных.
Переменные в фундаментальных структурах могут изменять только свое значение, а их структура и множество допустимых значений остаются неизменными. В результате, размер памяти, занимаемый такими переменными, остается постоянным.
Для переменных усложнённой структуры характерна способность изменять, в процессе выполнения программы, и значения и структуры. В такой классификации последовательности занимают промежуточное место, длина их меняется, но это изменение структуры носит тривиальный характер.
Структуры данных можно разделить на статические и динамические.
Статическая структура данных – это совокупность фиксированного количества переменных постоянной размерности с неизменных характером связи между ними.
Динамическая структура данных – это совокупность переменных, количество, размерность и характер взаимосвязи между которыми меняются во время выполнения программы.
Взависимости от способа хранения элементов структуры данных различают:
структуры данных, хранимые сами элементы данных
структуры данных, хранимые указатели на элементы данных
Структуры данных подразделяются на 2 основные категории: линейные и нелинейные.
Линейные содержат список элементов, упорядоченных по положению. В этом списке имеется первый, второй, и так далее, элементы.
Нелинейные определяют элементы без позиционного упорядочивания. Иерархию коллекций можно представить следующим образом:
Коллекции
Линейные Нелинейные
|
С последовательным доступом |
|
С прямым доступом |
С индексным |
Иерархические |
|
Групповые |
|
||||||
|
|
доступом |
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
Послед. |
|
|
|
|
Файлы |
|
|
Хеш- |
|
HEAP |
Множес |
|
|
|
Список |
Стек |
Очередь |
Дек |
прям. |
Запись Массив Словарь |
Дерево |
Граф |
Сеть |
||||||
файлы |
таблица |
дерево |
тво |
|||||||||||
|
|
|
|
доступа |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Структуры и алгоритмы компьютерной обработки данных |
5 |
|
|
Коллекции с прямым доступом
Файл – совокупность элементов данных, сгруппированных для хранения и использования в инфор- мационно-вычислительных системах. В качестве постоянного носителя для файла выступает внешняя память. В зависимости от способа доступа к файлам различают последовательные файлы и файлы прямого доступа.
Последовательный файл характеризуется последовательным размещением его физических элементов в порядке их поступления в файл и доступом к элементам файла в порядке их физического расположения на носителе.
Файл прямого доступа является аналогом таблицы с вычисляемым входом (хэш-таблица). Отличие заключается в том, что хеш-таблица размещается в оперативной памяти, а файла на внешних запоминающих устройствах прямого доступа. Причем, функция преобразования ключ – адрес записи на носителе и размещение коллизий обычно поддерживаются прикладной программой.
Массив – это коллекция элементов, имеющих один и тот же тип данных с прямым доступом посредством целого (целочисленного) индекса. Статический массив содержит фиксированное количество элементов и задается в памяти во время компиляции. Динамический массив создается с помощью методов динамического распределения памяти и его размер может быть изменен. Массив может быть использован для хранения списков.
Запись – это базовая структура, которая связывает элементы различных типов данных в один объект. Элементы в записи называются полями. Подобно массиву, запись имеет оператор доступа, который делает возможным прямой доступ к каждому полю, но в отличие от массива запись имеет единственное значение, а не список значений.
Множества – это коллекция, находящая применение, когда данные являются неупорядоченными, а каждый элемент данных является единственным в своем роде, уникальным.
Коллекции с индексным доступом
Хеширование, хеш-функции, методы устранения коллизий.
«to hash» - дословно нарезать, раскрошить
Хеширование является самым быстродействующим из известных методов программного поиска. Это его качество особенно проявляется при работе с данными большого размера. Данный метод удобен тем, что не требует никакого упорядочивания или сортировки ключевых слов.
Для методов хеширования используются также следующие термины: рассеянная память, адресация в разброс, адресация с перемешиванием, ключевые преобразования, расстановка.
Высокая скорость выполнения операций хеширования обусловлена тем, что элементы данных запоминаются и в последствии выбираются из ячеек памяти, адреса которых являются простыми арифметическими функциями, содержимого соответствующих ключевых слов.
Адреса, получаемые из ключевых слов методом хеширования, называются хеш-адресами.
Идея хеширования состоит в том, чтобы взять некоторые характеристики некоторого ключа (эту информацию получаем при помощи хеш-функции) и полученную частичную информацию используем в качестве адреса в некоторой таблице (которая именуется хеш-таблицей), где хранятся ключи и связанная с ним информация.
Хеш-таблица – таблица, ячейки которой пронумерованы и хранят данные или ссылки на данные. Хеш-функция – функция ( ), производящая некоторые арифметические преобразования над клю-
чом . Задача хеш-функции – получение уникального значения.
Функция, дающая неповторяющиеся значения редки даже в случае большой таблицы, поэтому может возникнуть ситуация, когда найдутся некоторые ключи , для которых ( ) ( ). Подобное событие называется коллизией. Таким образом, часто отображение осуществляемое хеш-функциями является отображением «многие-к-одному». При возникновении коллизии, два и более ключей ассоциируются с одной и той же ячейкой хеш-таблицы. В этом случае необходимо выбрать стратегию разрешения коллизий, то есть использовать какой-нибудь метод, указывающий альтернативное положение.
Структуры и алгоритмы компьютерной обработки данных |
6 |
|
|
Хеш-функции
Хеш-функция, не порождающая коллизий, называется совершенной. Нет смысла искать совершенную хеш-функцию, если множество ключей не является постоянным.
Требования к хеш-функции:
хеш-функция должна отображать ключ в целое число
количество коллизий должно быть ограничено
вычисления функции должны быть минимальными
Рассмотрим методы, удовлетворяющие этим правилам
Метод деления
Наиболее часто используется метод деления, требующие двух шагов. Сначала ключ должен быть
преобразован в целое число, а затем полученные значение вписываются в диапазон |
, где - |
|
число элементов в хеш-таблице, путем деление с остатком |
. На практике метод деления использует- |
ся в большинстве приложений с хешированием. Чаще всего используется деление по модулю. Если дается другая хеш-функция, то к ней ещё раз применяют деление. Рекомендуется брать в качестве размера хеш-таблицы простое число.
Метод умножения
Метод умножения, в котором сначала получается нормализованный хеш-адрес, размещенный в ин-
тервале |
). Этот адрес затем масштабируется в соответствии с истинным размером таблицы. Норма- |
|||
лизованным хеш-адресом называют величину |
( ) |
, где - некоторая константа из |
). |
|
Затем итоговый адрес ( ) вычисляется как |
( |
), где - размер хеш-таблицы. Качество хеширова- |
||
ния с умножением зависит от выбора константы |
. Хорошие результаты хеширования дает значение |
|||
константы |
. |
|
|
|
Метод серединных квадратов. |
|
|
|
Метод серединных квадратов предусматривает преобразование ключа в целое число возведением его в квадрат и возвращением в качестве значения функции последовательности цифр, извлеченных из
середины этого квадрата. |
|
|
|
|
|
Например, для |
: |
|
|
|
|
|
( |
) |
или ( ) |
( |
) |
Метод алгебраических преобразований
Метод алгебраических преобразований над ключом позволяет получать хеш-адреса путем выполнения алгебраических действий над цифрами, из которых состоит ключ. Например, сложение по модулю пары соседних цифр ключа. ( ) ( ) ( ) . Сложение первой и последней цифры ключа, получение сумма всех цифр ключа.
Метод усечения.
Метод усечения, при котором из ключа выделяются определенные биты, которые определяют хешадрес переменной.

Структуры и алгоритмы компьютерной обработки данных |
7 |
|
|
Методы устранения коллизий
Существуют два классических стратегий устранения коллизий:
открытая адресация с линейными или квадратичным опробованием
метод цепочек
Открытая адресация.
Эта методика предполагает, что каждая ячейка хеш-таблицы сначала помечена как не занятая. По этому, при добавлении нового ключа всегда можно определить, произошла ли коллизия. Если занята, то алгоритм осуществляет опробование по кругу, пока не встретиться открытый адрес, или не произойдет ошибка. Если размер таблицы велик относительно числа хранимых элементов (ключей), метод работает хорошо, поскольку хеш-функция будет равномерно рассеивать ключи по всему диапазону и число коллизий будет минимально. По мере того, как коэффициент заполнения таблицы приближается к , эффективность процесса заметно падает.
.
При открытой адресации будут проблемы с памятью, так как память выделяется только один раз. следует сделать рехеширование таблицы (создание новой таблицы с большим разме-
ром и новой хеш-функцией), так как основные операции потеряют эффективность.
При открытой адресации на линейном пробинге к хеш-адресу прибавляется или вычитается по еди-
нице до тех пор, пока не обнаружится незанятая ячейка. Если |
( ), то последующие номера будут |
|||
( |
) |
, где |
. В случае открытой адресации |
– общее количество элементов, |
размер хеш-таблицы – |
. |
|
Недостаток линейный проб заключается в том, что вычисленные адреса имеют тенденцию группироваться вокруг первичных адресов, что создает линейное заполнение. Первичное группирование ячеек можно устранить, применяя нелинейные пробы, в частности, квадратичный пробинг, при котором последовательность резервных адресов строится с использованием некоторой квадратичной функции.
При квадратичном опробовании последующие адреса ищутся ( )
Небольшой недостаток квадратичных проб заключается в том, что при поиске пробуются не все строки таблицы, то есть при включении элемента может не найтись свободного места, хотя на самом деле место в таблице есть. Если размер таблицы – простое число, то при квадратичных формах просматривается, по крайней мере, половина таблицы.
Метод цепочек.
При этом подходе к хешированию таблица рассматривается как массив связанных списков, каждая цепочка в котором называется блоком и содержит записи, отображаемые хеш-функцией в один и тот же табличный адрес. Если таблица является массивом связанных списков, то элемент данных вставляется в соответствующий список в качестве нового узла. Чтобы обнаружить элемент данных, нужно применить хеш-функцию для определения нужного связанного списка и выполнить последовательный поиск. Последовательный поиск – поиск в списке, стеке или очереди. Размер хеш-таблицы варьируется в интер-
вале ( ) .
В общем случае метод цепочек быстрее открытой адресации так, как просматриваются только те ключи, которые попадают в один и тот же табличный адрес. Кроме того, открытая адресация предполагает наличие таблицы фиксированного размера, в то время, как в методе цепочек элементы таблицы создаются динамически, а длина списка ограничена лишь количеством памяти. При методах открытой адресации часто встречается ситуации переполнения таблицы – необходимо рехеширование. Основным недостатком метода цепочек являются дополнительные затраты памяти на хранение указателей, но в общем случае, метод цепочек более предпочтителен для метода хеширования.
Использование хеш-таблиц.
Наиболее широкое распространение методы хеширования получили в системном программировании. Хеш-таблицы стали применяться в ассемблерах фирмы IBM, начиная с 1954 года, а в настоящее время практически все символьные таблицы ассемблеров строятся по принципу хеширования. Внедрение этой методики обусловлено стремлением снизить затраты на проведение вычислений, объем которых в значительной степени определяются продолжительностью этапа компиляции, поскольку в процессе компиляции, а также выполнения программы, таблицы символов опрашиваются очень часто и в произвольном порядке. Хеширование оказывается наиболее эффективным методом их формирования. Другой областью применения методов хеширования является управление базами данных. Из известных к настоящему времени таблиц хеширования наиболее сложной организацией отличаются таблицы,
Структуры и алгоритмы компьютерной обработки данных |
8 |
|
|
применяемые в языках искусственного интеллекта. Ещё одной областью применения метода хеширования является создание ключей при формировании электронно-цифровой подписи. В последнее время защита информации становиться актуальной.
Словарь
Словарь – коллекция слов и их определений (т.е. ищем слово, используя его как ключ).
Словарь состоит из пар ключ-значение, называемых ассоциациями. К значению ассоциации осуществляется прямой доступ с использованием ключа в качестве индекса. В этом случае, индексом является ключ. Словари называют ассоциативными массивами, в которых общий индекс связан со значением данных.
Коллекции с последовательным доступом.
Список
Более общей коллекцией является список, сохраняющий элементы в последовательном порядке. Эта структура содержит произвольное количество элементов. Размер списка изменяется добавлением или удалением элементов, ссылка на элементы в списке выполняется по их положению. Первый элементы находится в голове списка (head), последний в хвосте (rear). Каждый элемент за исключением последнего имеет единственный последующий элемент. Структура списка является ограничивающей, когда необходим доступ к произвольным элементам, так как в ней нет прямого доступа. Для доступа к элементам списка необходимо выполнять прохождение элементов от начальной точки в списке. Реализовать списки можно с помощью массива и указателей. При реализации списка с помощью массива элементы списка располагаются в смежных ячейках массива. Это представление позволяет легко просматривать содержимое списка и вставлять новые элементы в его конец. Однако вставка нового элемента в середину списка подразумевает перемещение большого числа всех последующих элементов на одну позиция к концу массива, чтобы освободить место для вставляемого элемента. Удаление элемента также требует перемещения элементов, чтобы закрыть освободившуюся ячейку. При использовании указателей мы определяем тип список как запись, состоящую из двух полей. Первое поле – элементы массива, чей размер памяти считается достаточным для хранения списка, второе поле – целочисленного тип указывает на позицию последнего элемента списка в массиве.
Структура данных, называемая связанным списком и реализованная с помощью указателей, предоставляет более эффективные методы обработки, чем при использовании массивов.
Стеки и очереди – особые версии линейного списка с ограниченным доступом к элементам данных.
Стек
Стек – специальный тип списка, в котором все вставки и удаление выполняются только на одном конце, называемом вершиной (top). Операция удаления элемента из списка называется извлечением из стека (pop). Операция добавления элемента в список – помещение элемента в стек (push). При помещении элемента в стек все другие элементы, находящиеся в данных момент в стеке опускаются вниз, уступая место на вершине новому элементу. Когда элементы удаляются из стека, они перемещаются в обратном порядке. Последний элемент, помещенный в стек, является первым извлекаемым из стека. Стек иногда называют магазином. Этот тип хранения элементов LIFO (Last Input – First Output).
Абстрактные типы данных семейства стек обычно используют следующие пять операторов:
pop – удаление элемента из вершины стека,
push – помещение элемента в вершину стека,
peek (top) – возвращение значения элемента из вершины стека, без её удаления,
CheckEmptyStack – проверка пустоты стека (возвращает 1, если стек пустой, и ноль в противном случае),
ClearStack – очистка стека.
Структуры и алгоритмы компьютерной обработки данных |
9 |
|
|
Очередь
Очередь – специальный тип списка, в котором операция вставки выполняется на хвосте списка, а операция удаления выполняется на голове списка. Хранение элементов соответствует порядку из по-
ступления – FIFO (First Input – First Output).
Абстрактные типы данных семейства очередь обычно используют следующие пять операторов:
Insert (Enqueue) – вставить (добавить) элемент в конец очереди,
Delete (Dequeue) – извлечь (удалить) элемент из головы очереди,
Front – получить элемент из головы очереди без удаления,
ClearQueue – очистка очереди,
QueueLength – длина очереди.
Для некоторых случаев, положение элемента в очереди определяется его приоритетом. При каждой операции извлечения обрабатывается элемент с наивысшим приоритетом. Позиция для вставки элемента не является важной, так как не влияет на приоритеты в очереди.
Дек
Дек – это разновидность очереди, в который включение и выборка элементов возможны с обоих концов. Например, дек может использоваться при управлении памяти, когда распределение памяти происходит и сверху и снизу. Существует две разновидности дека:
дек с ограниченным входом, который допускает включение элементов только на одном из концов, выход на обоих.
дек с ограниченным выходом допускает выборку элементов только с одного конца.
Иерархические коллекции
Иерархические коллекции – коллекции, элементы в которых могут быть расположены по разделению на уровни.
Дерево – коллекция, такая что, элементы одного уровня могут иметь несколько наследников на следующем уровне. Все элементы дерева происходят из одного источника, называемого корнем. Элементы дерева называют узлами, каждый узел указывает на нисходящие узлы, называемые потомками.
Heap-дерево – особый вид дерева, в котором самый маленький элемент всегда занимает корневой узел. Удаление и добавление элементов могут вызвать полную реорганизацию дерева, при которой корневой узел займет новый наименьший элемент.
Дерево
Дерево – нелинейная структура (коллекция), которая состоит из узлов и ветвей и имеет направление от единственного начального узла, называемого корнем, к внешним узлам, называемым листьями. Каждый узел дерева является корнем поддерева, которое определяется данным узлом и всеми потомками этого узла.
Прохождение от родительского узла к его дочернему узлу и другим потомкам осуществляется вдоль единственного пути. Тот факт, что каждый не корневой узел имеет единственного родителя, гарантирует, что существует единственный путь из любого узла к его потомкам. Путь от корня к узлу дает меру, называемую уровнем узла. Уровень узла есть длина пути от корня к этому узлу. Уровень корня равен . Каждый сын корня является узлом первого уровня. Следующее поколение – узлы второго уровня.
Глубина дерева – есть максимальный уровень любого его узла. Понятие «глубина» может быть описано в терминах пути: глубина дерева – длина самого длинного пути от корня до узла.
Рассматриваются следующие виды деревьев:
1)Бинарные (двоичные)
1)Идеально-сбалансированные
2)Поисковые
3)Сбалансированно-поисковые (AVL)
2)Сильноветвящиеся: B-дерево

Структуры и алгоритмы компьютерной обработки данных |
10 |
|
|
Бинарное дерево
Упорядоченными деревьями второй степени называются двоичные (бинарные) деревья.
Определим упорядоченное двоичное дерево как конечное множество элементов или вершин, которые либо пусто, либо состоит из трех непересекающихся подмножеств: корня с двумя отдельными двоичными деревьями, которые называют левым и правым поддеревом этого корня. Наименование левый и правый относятся к графическому представлению дерева.
Бинарное дерево является рекурсивной структурой, каждый узел дерева - это корень его собственного поддерева. У него есть сыновья, которые сами являются корнями поддеревьев, называемых левым и правым поддеревьями соответственно. Процедуры обработки деревьев также рекурсивны. На любом уровне бинарное дерево может содержать от одного до узлов (где – значения уровня). Число узлов, приходящихся на уровень, является показателем плотности дерева.
Дерево, у которого есть единственный лист, и каждый не листовой узел имеет одного потомка, называется вырожденным. Это крайняя мера плотности, такое вырожденное дерево эквивалентно связанному списку.
Деревья с большой плотностью очень важны в качестве структур данных, так как они содержат пропорционально больше элементов вблизи корня, то есть с более короткими путями от корня. Плотное дерево позволяет хранить большие коллекции данных и осуществлять эффективный доступ к элементам.
Другая крайность – законченные бинарные деревья глубины , где каждый уровень от до имеет полный набор узлов, то есть все левые и правые, и все листья уровня расположены слева. За-
конченное бинарное дерево, содержащее |
узлов на уровне |
, является полным. Законченное и полное |
||
бинарные деревья дают следующие математические факты: |
на нулевом уровне имеется |
узлов, на |
||
втором – |
, на уровне количество дополнительных узлов от 1 до . В полном дереве число узлов |
|||
равно |
. |
|
|
|
Структура двоичного дерева.
Двоичные деревья часто используют для представления множества данных, среди которых осуществляется поиск по уникальному ключу. Структура бинарного дерева, построенного из узлов, состоит из записи (для каждого узла), где содержатся поле данных (Data) и два поля с указателями – на левое (Left) и правое (Right) поддерево. Поля указателей называются левым указателем и правым указателем. Значения NULL является признаком пустого дерева.
|
|
|
|
|
left |
|
|
data |
right |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
left |
data |
|
right |
|
|
|
|
|
null |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
null |
|
|
|
|
|
null |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Корневой узел определяет входную точку дерева, а поля указателей – узлы следующего уровня. Листовой узел содержит нулевые значения в поле правого и левого указателей. Как описание, так и все методы обработки дерева являются рекурсивными.
Рекурсивные методы прохождение деревьев.
Рекурсивное определение бинарного дерева определяет эту структуру как корень с двумя поддеревьями, которые идентифицируются полями левого и правого указателей. Начало любой обработки происходит в корневом узле.
Сила рекурсии проявляется вместе с методами прохождения. Каждый алгоритм прохождения выполняет в узле три действия:
1)заходит в узел (обрабатывает данные или узел в целом),
2)рекурсивно спускается по левому поддереву,
3)рекурсивно спускается по правому дереву.
Спустившись к поддереву, алгоритм определяет, что он находится в узле и может выполнять те же 3 действия в той же последовательности. Спуск прекращается по достижению пустого дерева (нулевого указателя NULL). Листовой узел заставляет подняться алгоритм вверх по рекурсии.