Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
10_САОД.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
333.31 Кб
Скачать

1. Бинарные деревья поиска

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

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

2. АВЛ-леревья

Дерево называется АВЛ-деревом. если для любого его узла высоты левого и правого поддеревьев отличаются не более чем на 1. АВЛ-дерево называют сбалансированным по высоте.

Для сбалансированного дерева этот показатель может принимать всего три значения:

• 0— высоты поддеревьев равны;

• -1 — левое поддерево немного перевешивает:

• 1 — правое поддерево немного перевешивает.

АВЛ-дерево гарантированно обеспечивает время поиска, не превышающее наилучший случай более чем на 45%.

3. Сильноветвяшнеся деревья

Еще одна группа сбалансированных деревьев поиска, которая использует другой способ поддержки сбалансированности. — снльноветвящнеся деревья. Напомним, что узлы сильноветвящнхся деревьев могут иметь более двух сыновей, т. е. их нельзя отнести к бинарным деревьям. Однако принцип упорядоченности для сильноветвящнхся деревьев аналогичен принципу, по которому строятся бинарные деревья поиска. А для того, чтобы обеспечить ветвление более чем по двум направлениям, узлам разрешено иметь более одного ключа.

Хэширование

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

время. Возникает вопрос, можно ли выполнить поиск по ключу с константной сложностью? на этой основе может возникнуть другая идея — преобразование знамения ключа в индекс элемента массива с использованием какой-либо последовательности арифметических операций, возвращающей результат в виде целого числа в заданном ограниченном диапазоне. Эта идея воплощена в одном распространенном методе реализации структур для поддержки поиска, который получил название хеширования (hashing). Математическая функция h(K), которая преобразует значений ключей К в индексы элементов массива, называется хеш-функцией. Сами индексы иначе называются хеш-адресами и находятся в диапазоне от 0 до М-1, где М— некоторое положительное целое число. Массив размером М. в котором ведется поиск, называется хеш-таблицей и обычно представляет собой массив записей (ключи н связанная информация или указатель на нее). В частном случае элементами хеш-таблицы могут быть просто значения ключей (числа или строки текста).

Ситуация, когда для различных ключей получается одно и то же хэш-значение, называется коллизией (collision).

Число хранимых элементов делённое на размер массива H (число возможных значений хэш-функции) называется коэффициентом заполнения хэш-таблицы (load factor) и является важным параметром, от которого зависит среднее время выполнения операций.

Существует несколько способов разрешения колизий.

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

Среднее время выполнения операций в хэш-таблице с прямой адресацией равно коэффициенту заполнения.

2. Открытая адресация. В массиве H хранятся сами пары. В случае возникновения коллизии, алгоритм поиска (удаления, добавления) объекта просто перемещается на ячейку вправо до момента разрешения коллизии. Разрешение коллизии происходит при достижении пустой ячейки или ячейки, в котором хранится пара с заданным ключом.