Поисковые структуры данных — различия между версиями
(→Сравнение структур данных) |
|||
| Строка 1: | Строка 1: | ||
'''Поисковая структура данных''' {{---}} любая структура данных реализующая эффективный поиск конкретных элементов множества, например, конкретной записи в базе данных. | '''Поисковая структура данных''' {{---}} любая структура данных реализующая эффективный поиск конкретных элементов множества, например, конкретной записи в базе данных. | ||
| − | Простейший, наиболее общий, но менее эффективный поисковой структурой является простая неупорядоченный последовательная всех элементов. Расположив элементы в такой список, неизбежно возникнет ряд операций, которые потребуют линейного времени, в худшем случае, а также в средней случае. Используемые в реальной жизни поисковые структуры данных позволяют совершать операции более быстро, однако они ограничены запросами некоторого конкретного вида. Кроме того, поскольку стоимость построение таких структур | + | Простейший, наиболее общий, но менее эффективный поисковой структурой является простая неупорядоченный последовательная всех элементов. Расположив элементы в такой список, неизбежно возникнет ряд операций, которые потребуют линейного времени, в худшем случае, а также в средней случае. Используемые в реальной жизни поисковые структуры данных позволяют совершать операции более быстро, однако они ограничены запросами некоторого конкретного вида. Кроме того, поскольку стоимость построение таких структур пропорциональна <tex>n</tex>, их построение окупится, даже если поступает лишь несколько запросов. |
=== Тип === | === Тип === | ||
Версия 01:00, 25 мая 2015
Поисковая структура данных — любая структура данных реализующая эффективный поиск конкретных элементов множества, например, конкретной записи в базе данных.
Простейший, наиболее общий, но менее эффективный поисковой структурой является простая неупорядоченный последовательная всех элементов. Расположив элементы в такой список, неизбежно возникнет ряд операций, которые потребуют линейного времени, в худшем случае, а также в средней случае. Используемые в реальной жизни поисковые структуры данных позволяют совершать операции более быстро, однако они ограничены запросами некоторого конкретного вида. Кроме того, поскольку стоимость построение таких структур пропорциональна , их построение окупится, даже если поступает лишь несколько запросов.
Содержание
Тип
Статические поисковые структуры данных (англ. Online search structures) предназначены для ответа на запросы на фиксированной базе данных; Динамические поисковые структуры (англ. Offline search structures) также позволяют вставки, удаления или модификации элементов между последовательными запросами. В динамическом случае, необходимо также учитывать стоимость изменения структуры данных. Любую динамическую структуру данных можно сделать статической, если запретить вставку и удаление. Также если множество ключей известно, то можно его заранее упорядочить так, чтобы избежать худших случаев в поисках в структурах данных.
Время работы
Эту классификацию обычно считают самой важной. Оценивают худшее время алгоритма, среднее и лучшее для каждой операции. Лучшее время — минимальное время работы алгоритма на каком-либо наборе. Худшее время — наибольшее время.
Используемая память
Параметр структуры данных, показывающий, сколько памяти ей требуется. Обычно затраты составляют .
Сравнение структур данных
Сравним эффективность поисковых структур данных для реализации интерфейса упорядоченного множества. Время работы методов и совпадает с временем работы .
— количество хранимых чисел, каждое из которых представляется с помощью битов.
| Insert | Delete | Search | Память | Описание | |||||
|---|---|---|---|---|---|---|---|---|---|
| Среднее | Худшее | Среднее | Худшее | Среднее | Худшее | Среднее | Худшее | ||
| Динамические структуры данных | |||||||||
| Неотсортированный массив | Наивная реализация, использующая динамический массив. Добавление происходит в конец массива, а для поиска элемента просто проходим по всему массиву. | ||||||||
| Отсортированный массив | То же самое, но теперь массив отсортирован. Поиск ускоряется за счёт возможности применить двоичный поиск. Вставка замедляется из-за необходимости поддерживать инвариант отсортированности. | ||||||||
| Неотсортированный список | Аналогично массиву, но храним данные в списке. Можно хранить дополнительную информацию о вершинах, что позволит ускорить время работы операции delete. | ||||||||
| Отсортированный список | |||||||||
| Дерево поиска, наивная реализация | Бинарное дерево поиска обладает следующим свойством: если — узел бинарного дерева с ключом , то все узлы в левом поддереве должны иметь ключи, меньшие , а в правом поддереве большие . | ||||||||
| Рандомизированное бинарное дерево поиска | Вариант двоисного дерево поиска с добавлением инвариата "случайности". Что дает возможность того, что математическое ожидание глубины дерева будет небольшим. | ||||||||
| АВЛ-дерево | Сбалансированное двоичное дерево поиска, в котором поддерживается следующее свойство: для каждой его вершины высота её двух поддеревьев различается не более чем на . | ||||||||
| 2-3 дерево | Структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. Является частным случаем B+ дерева. | ||||||||
| B-дерево | Cильноветвящееся сбалансированное дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за . B-дерево с узлами имеет высоту . Количество детей узлов может быть от нескольких до тысяч (обычно степень ветвления B-дерева определяется характеристиками устройства (дисков), на котором производится работа с деревом). В-деревья также могут использоваться для реализации многих операций над динамическими множествами за время | ||||||||
| Красно-черное дерево | Сбалансированное двоичное дерево поиска, в котором баланс осуществляется на основе "цвета" узла дерева, который принимает только два значения: "красный" (англ. red) и "чёрный" (англ. black). При этом все листья дерева являются фиктивными и не содержат данных, но относятся к дереву и являются чёрными. | ||||||||
| Декартово дерево | Бинарное дерево, в узлах которого хранится пары , где — это ключ, а — это приоритет. Также оно является двоичным деревом поиска по и пирамидой по . Предполагая, что все и все являются различными, получаем, что если некоторый элемент дерева содержит , то у всех элементов в левом поддереве , у всех элементов в правом поддереве , а также и в левом, и в правом поддереве имеем: . | ||||||||
| Splay-дерево | Двоичное дерево поиска. Оно позволяет находить быстрее те данные, которые использовались недавно, за счёт перемещения к корню (англ. Move to root). Относится к разряду сливаемых деревьев. Сплей-дерево было придумано Робертом Тарьяном и Даниелем Слейтером в 1983 году. | ||||||||
| Дерево ван Эмде Боаса | Cтруктура данных, представляющая собой дерево поиска, позволяющее хранить целые неотрицательные числа в интервале и осуществлять над ними все соответствующие дереву поиска операции. Проще говоря, данная структура позволяет хранить -битные числа.
Особенностью этой структуры является то, что все операции выполняются за , что асимптотически лучше, чем в большинстве других деревьев поиска, где — количество элементов в дереве. | ||||||||
| Список с пропусками | Вероятностная структура данных, основанная на нескольких отсортированных односвязных списках.
Отсортированный связный список является простейшей структурой с временем поиска . Добавление дополнительных уровней, обеспечивающих быстрый доступ через несколько элементов, помогает улучшить асимптотику до | ||||||||
| Fusion tree | Дерево поиска, позволяющее хранить -битных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложена в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard). | ||||||||
| Цифровой бор | Бор, в котором в качестве строк используются двоичные записи чисел, включая ведущие нули. Таким образом он имеет глубину . | ||||||||
| Быстрый цифровой бор | Улучшеная версия структуры цифрового бора. | ||||||||
| Сверхбыстрый цифровой бор | Улучшеная версия структуры быстрого цифрового бора. | ||||||||
| Статические структуры данных | |||||||||
| Tango-дерево | - | - | Двоичное дерево поиска, которое изобрели Эрик Д. Демейн, Дион Хармон, Джон Яконо и Михаи Патраску в 2004 году. Не поддерживает операции вставки и удаления, но перестраивается по ходу поисковых запросов, чтобы отвечать на них как можно оптимальней. Это лучшая известная реализация на данный момент. | ||||||