- •Линейные структуры данных массив, структура (запись) и множество: организация и основные операции
- •Множество
- •Линейные структуры данных стек, очередь и дек: организация и основные операции Стек
- •Очередь
- •Структура данных дерево: общее определение. Двоичные деревья, способы реализации Деревья Общие сведения
- •Реализация
- •Структура данных граф: определение и способы реализации Графы. Спецификация
- •Реализация
- •Структура данных файл: общие сведения об их организации Файлы
- •Организация
- •Хеширование данных. Основные понятия и виды хеширования, функция хеширования Хеширование данных. Функция хеширования
- •Открытое хеширование
- •Закрытое хеширование
- •Упорядоченные деревья поиска: способы реализации и основные операции. Определение сбалансированного по высоте дерева поиска (авл-дерево) Упорядоченные деревья поиска
- •Случайные деревья поиска
- •Оптимальные деревья поиска
- •Сбалансированные по высоте деревья поиска
- •8. Алгоритм быстрой сортировки (Хоара) Быстрая сортировка (Хоара)
- •Алгоритмы обхода графа
- •Поиск в глубину
- •Поиск в ширину (Волновой алгоритм)
- •10. Алгоритмы нахождения минимального остовного дерева графа: алгоритм Прима, алгоритм Крускала Алгоритм Крускала
Случайные деревья поиска
Случайные деревья поиска представляют собой упорядоченные бинарные деревья поиска, при создании которых элементы (их ключи) вставляются в случайном порядке.
При создании таких деревьев используется тот же алгоритм, что и при добавлении вершины в бинарное дерево поиска. Будет ли созданное дерево случайным или нет, зависит от того, в каком порядке поступают элементы для добавления. Примеры различных деревьев, создаваемых при различном порядке поступления элементов приведены ниже.
Рисунок 12. Случайные и вырожденные деревья поиска
При поступлении элементов в случайном порядке получаем дерево с минимальной высотой h (см. Рисунок 12.а), а соответственно минимизируется время поиска элемента в таком дереве, которое пропорционально O(log n). При поступлении элементов в упорядоченном виде (см. Рисунок 12.б) или в несколько необычном порядке (см. Рисунок 12.в) происходит построение вырожденных деревьев поиска (оно вырождено в линейный список), что нисколько не сокращает время поиска, которое составляет O(n).
Оптимальные деревья поиска
При поиске в двоичном дереве одни элементы могут искаться чаще, чем другие, то есть существуют вероятности pk поиска k-го элемента и для различных элементов эти вероятности неодинаковы. Можно сразу предположить, что поиск в дереве в среднем будет более быстрым, если те элементы, которые ищутся чаще, будут находиться ближе к корню дерева.
Пусть даны 2n+1 вероятностей p1, p2, …, pn, q0, q1, …, qn, где
pi – вероятность того, что аргументом поиска является Ki;
qi – вероятность того, что аргумент поиска лежит между Ki и Ki+1;
q0 – вероятность того, что аргумент поиска меньше, чем K1;
qn – вероятность того, что аргумент поиска больше, чем Kn;
Тогда цена дерева поиска C будет определяться следующим образом:
где levelrootj – уровень узла j, а levellistk – уровень листа k.
Дерево поиска называется оптимальным, если его цена минимальна или, другими словами, оптимальное бинарное дерево поиска – это бинарное дерево поиска, построенное в расчете на обеспечение максимальной производительности при заданном распределении вероятностей поиска требуемых данных.
Существует подход построения оптимальных деревьев поиска, при котором элементы вставляются в порядке уменьшения частот, что дает в среднем неплохие деревья поиска. Однако этот подход может дать вырожденное дерево поиска (см. п. ), которое будет далеко от оптимального.
Еще один подход состоит в выборе корня k таким образом, чтобы максимальная сумма вероятностей для вершин левого поддерева или правого поддерева была настолько мала, насколько это возможно. Такой подход также может оказаться плохим в случае выбора в качестве корня элемента с малым значением pk.
Существуют алгоритмы, которые позволяют построить оптимальное дерево поиска. К ним относится, например, алгоритм Гарсия-Воча. Однако такие алгоритмы имеют временную сложность порядка O(n2), а некоторые еще имеют такую же пространственную сложность. Таким образом, создание оптимальных деревьев поиска требует больших накладных затрат, что не всегда оправдывает выигрыш при быстром поиске.