Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

14.3. Внешний поиск и b-деревья 679

14.3 Внешний поиск и B-деревья

Рассмотрите проблему осуществления карты ADT для большого количества пунктов, которые не вписываются в главную память. Так как одно из главного использования большой карты находится в базе данных, мы именуем блоки вторичной памяти как дисковые блоки. Аналогично, мы обращаемся к передаче блока между вторичной памятью и основной памятью как дисковая передача. Вспоминая различие прекрасного времени, которое существует между главными доступами памяти и дисковыми доступами, главная цель поддержания карты во внешней памяти состоит в том, чтобы минимизировать число дисковых передач, должен был выполнить вопрос или обновление. Фактически, различие в скорости между диском и внутренней памятью столь большое, что мы должны быть готовы выполнить значительное число доступов внутренней памяти, если они позволяют нам избегать нескольких дисковых передач. Позвольте нам, поэтому, проанализируйте выполнение внедрений карты, считая число дисковых передач, которых каждый потребовал бы, чтобы выполнить стандартные операции по поиску и обновлению карты. Мы именуем это количество как сложность ввода/вывода включенных алгоритмов.

Некоторые словари Внешней Памяти Inefcient

Давайте сначала рассмотрим простые внедрения карты, которые используют список, чтобы сохранить n en-попытки. Если список осуществлен, поскольку несортированный, вдвойне связанный список, то вставляет и удаляет операции, может быть выполнен с O (1) передачи каждый, но удаления и поиски требуют передач n в худшем случае, так как каждый перелет связи, который мы выполняем, мог получить доступ к различному блоку. Это время поиска может быть улучшено до O (n/B) передачи (см. Упражнение C-14.2), где B обозначает число узлов списка, который может вписаться в блок, но это - все еще неудовлетворительная работа. Мы могли поочередно осуществлять последовательность, используя сортированное множество. В этом случае поиск выполняет O (log2 n) передачи через двоичный поиск, который является хорошим улучшением. Но это решение требует, чтобы Q (n/B) перешел, чтобы осуществить вставку или удалить операцию в худшем случае, потому что нам, вероятно, придется получить доступ ко всем блокам, чтобы переместить элементы вверх или вниз. Таким образом основанные на списке внедрения карты не эффективны во внешней памяти.

Так как эти простые внедрения - неэффективный ввод/вывод, мы должны рассмотреть логарифмически-разовые, стратегии внутренней памяти, которые используют уравновешенные двоичные деревья (например, деревья AVL или красно-черные деревья) или другие структуры поиска с логарифмическим вопросом среднего случая и обновляют времена (например, пропустите списки или вывихните деревья). Эти методы хранят пункты карты в узлах двоичного дерева или графа. Как правило, каждый узел получил доступ для вопроса, или обновление в одной из этих структур будет в различном блоке. Таким образом эти методы все требуют, чтобы O (log2 n) передачи в худшем случае выполнил операция по обновлению или вопрос. Эта работа хороша, но мы можем добиться большего успеха. В частности мы можем выполнить вопросы карты, и обновления, используя только O (logB n) = O (зарегистрируйте регистрацию n/B), передачи.