28
Деревья и их представление в STL Презентацию подготовила Чиркова Ольга, 2 подгруппа, группа 271ПИ

Деревья и их представление в STL Презентацию подготовила Чиркова Ольга, 2 подгруппа, группа 271ПИ

  • View
    238

  • Download
    1

Embed Size (px)

Citation preview

Деревья и их представление в STL

Презентацию подготовила

Чиркова Ольга,

2 подгруппа,

группа 271ПИ

Что такое дерево?

Дерево – это структура данных, позволяющая выполнять операции

вставки, удаления, поиска элементов за нелинейное

время

• Только одна вершина дерева не имеет предков – корень.

• Все вершины, кроме корня, имеют единственного предка.

• Вершины, не имеющие детей – листья.• Высота дерева – наибольшее число

вершин от листа до корня. • Из любой вершины можно добраться до

корня, последовательно перебираясь от одной вершины к ее предку, единственным путем.

Основные понятия:

Примеры деревьев:

• Файловая система;

• Иерархия в организациях (начальник - подчиненные);

• Генеалогическое дерево.

По максимальному количеству детей каждой вершины деревья

делятся на:

• Деревья (в общем)

Вершины имеют любое количество потомков

• М-арные деревья

Вершины имеют строго ограниченное количество потомков (бинарные, тернарные деревья)

Двоичные деревья

Двоичное дерево – это M-арное дерево, у которого M=2.

Куча (heap) – дерево, содержащее элементы либо в порядке убывания, либо в порядке возрастания.

Кучи• Max-heap

Значение в любой вершине больше, чем значения ее потомков

• Min-heap

Значение в любой вершине меньше, чем значения ее потомков

Деревья двоичного поиска

Дерево двоичного поиска – это двоичное дерево, с каждым из узлов которого связан ключ, причем:

• у всех узлов правого поддерева произвольного узла n значение ключей не меньше, нежели значения ключа узла n.

• у всех узлов левого поддерева произвольного узла n значение ключей меньше, нежели значения ключа узла n.

Несбалансированные деревья бинарного поиска (unbalanced)

Это такие деревья, высота правого и левого поддеревьев которых отличаются более, чем на 1.

Дерево двоичного поиска становится несбалансированным, когда в него постоянно добавляются элементы большего или меньшего размера

Неполные деревья двоичного поиска (incomplete)

Каждый узел дерева двоичного поиска должен содержать более 2 детей. Но он может иметь 1 или не иметь детей.

Если в дереве есть такие хотя бы один такой узел, дерево называют неполным.

Использование деревьев двоичного поиска

Дерево двоичного поиска может быть использовано для реализации таких абстракций, как множество, словарь (набор соответствий "ключ-значение"), очередь с приоритетами и так далее.

Использование деревьев двоичного поиска

Далее рассмотрим контейнеры STL, основанные на деревьях и приведем примеры работы с ними.

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

Использование деревьев двоичного поиска

Пояснения на следующем слайде

Поиск значений в двоичном дереве поиска реализован рекурсивно.

Процедура принимает на вход вершину. Сравнивает ее значение с искомым: в случае

равенства, искомое значение найдено, иначе – рекурсивно перемещаемся в корень соответствующего поддерева: либо большего, либо меньшего.

Если же нужного поддерева нет, то искомое значение не содержится в дереве.

Использование деревьев двоичного поиска

Использование STLМножество (set)

Множество (set) – это ассоциативный контейнер, содержащий только значения ключей.

• Значения ключей уникальны. Повторяющиеся элементы не заносятся в множество.

• Элементы множества хранятся отсортированными

Работа со множествами

• Объявление объектов класса set:

• Добавление элементов во множество с помощью функции insert

Работа с множествами

• Узнаем количество элементов множества с помощью функции size:

• Поиск элемента множества, с помощью функции find:

Алгоритмы работы с множествами

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

Алгоритмы работы со множествами (STL)

Алгоритм Выполняемая функция

set_intersection Создает отсортированное перечисление множеств (то есть множество, содержащее только элементы, входящие и в первое, и во второе множество)

set_union Создает отсортированное объединение множеств (то есть множество, содержащее элементы первого и второго множества без повторов)

set_difference Создает отсортированную последовательность элементов, входящих только в первую из двух последовательностей.

set_symmetric_difference

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

Пример использования алгоритмов работы со

множествами

Использование STLСловарь (map)

Словарь map – это ассоциативный массив, построенный на основе пар значений:

- ключ для идентификации элемента

- собственно элемент• Значения ключей уникальны (кроме

multimap) • Элементы в словаре хранятся

отсортированными

Работа со словарем

• Объявление объектов класса map:

• Вставка элементов с помощью функции insert

Работа со словарем• Более быстрый способ вставки элемента с

помощью операции [ ] :

• Доступ к элементам по ключу с помощью операции [ ]:

• Просмотр элеметов с помощью итератеров

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

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

Использование STLОчереди с приоритетами

(priority_queue)

Пример использования очереди с приоритетами

Библиотека STL позволяет в качестве функций сравнения использовать пользовательские функции либо классы.

Использование контейнеров

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

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

Стандартные классы просто так в состав С++ не

добавляются.

• Г. Шилдт