
- •1.Алгоритм, атд, структура. Анализ алгоритмов.
- •2. Линейные структуры данных
- •3.Деревья и леса
- •4. Сортировка данных
- •1. Пирамидальная сортировка
- •2. Сортировка слиянием
- •3. Быстрая сортировка Хоара
- •6. Поиск
- •1. Последовательный (линейный) поиск
- •2. Бинарный поиск в упорядоченном массиве
- •1. Бинарные деревья поиска
- •3. Сильноветвяшнеся деревья
- •5. Графы
- •7. Алгоритмы исчерпывающего поиска
1. Бинарные деревья поиска
Если на больших совокупностях данных поиск, вставка и удаление выполняются достаточно часто, стоит подумать об отказе от линейной структуры в пользу иерархической. Для этого есть весомые основания — в древовидной структуре, в отличие от линейной, путь от корня к любым данным не превышает высоты дерева, следовательно, имеется реальная возможность вообще избавиться от медленных операций с линейной сложностью.
Для бинарных деревьев в лучшем случае имеем логарифмическую сложность поиска, как для бинарного поиска в отсортированном массиве. Вырожденные деревья, которые, по сути, ничем не отличаются от линейных списков дают линейную сложность поиска.
2. АВЛ-леревья
Дерево называется АВЛ-деревом. если для любого его узла высоты левого и правого поддеревьев отличаются не более чем на 1. АВЛ-дерево называют сбалансированным по высоте.
Для сбалансированного дерева этот показатель может принимать всего три значения:
• 0— высоты поддеревьев равны;
• -1 — левое поддерево немного перевешивает:
• 1 — правое поддерево немного перевешивает.
АВЛ-дерево гарантированно обеспечивает время поиска, не превышающее наилучший случай более чем на 45%.
3. Сильноветвяшнеся деревья
Еще одна группа сбалансированных деревьев поиска, которая использует другой способ поддержки сбалансированности. — снльноветвящнеся деревья. Напомним, что узлы сильноветвящнхся деревьев могут иметь более двух сыновей, т. е. их нельзя отнести к бинарным деревьям. Однако принцип упорядоченности для сильноветвящнхся деревьев аналогичен принципу, по которому строятся бинарные деревья поиска. А для того, чтобы обеспечить ветвление более чем по двум направлениям, узлам разрешено иметь более одного ключа.
Хэширование
Вспомним, что самый быстрый способ поиска данных — прямой доступ к элементам массива по их индексу, который всегда выполняется за константное
время. Возникает вопрос, можно ли выполнить поиск по ключу с константной сложностью? на этой основе может возникнуть другая идея — преобразование знамения ключа в индекс элемента массива с использованием какой-либо последовательности арифметических операций, возвращающей результат в виде целого числа в заданном ограниченном диапазоне. Эта идея воплощена в одном распространенном методе реализации структур для поддержки поиска, который получил название хеширования (hashing). Математическая функция h(K), которая преобразует значений ключей К в индексы элементов массива, называется хеш-функцией. Сами индексы иначе называются хеш-адресами и находятся в диапазоне от 0 до М-1, где М— некоторое положительное целое число. Массив размером М. в котором ведется поиск, называется хеш-таблицей и обычно представляет собой массив записей (ключи н связанная информация или указатель на нее). В частном случае элементами хеш-таблицы могут быть просто значения ключей (числа или строки текста).
Ситуация, когда для различных ключей получается одно и то же хэш-значение, называется коллизией (collision).
Число хранимых элементов делённое на размер массива H (число возможных значений хэш-функции) называется коэффициентом заполнения хэш-таблицы (load factor) и является важным параметром, от которого зависит среднее время выполнения операций.
Существует несколько способов разрешения колизий.
1. Прямая адресация. В массиве H хранятся списки пар. Коллизии просто приводят к тому, что появляются списки длиной более одного элемента.
Среднее время выполнения операций в хэш-таблице с прямой адресацией равно коэффициенту заполнения.
2. Открытая адресация. В массиве H хранятся сами пары. В случае возникновения коллизии, алгоритм поиска (удаления, добавления) объекта просто перемещается на ячейку вправо до момента разрешения коллизии. Разрешение коллизии происходит при достижении пустой ячейки или ячейки, в котором хранится пара с заданным ключом.