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

682 Глава 14. Управление памятью и b-деревья

14.3.2 B-деревья

Версия (a, b) структура данных дерева, которая является самым известным методом для

ведя карту во внешней памяти, назван «B-деревом». (См. рисунок 14.6.) A

B-дерево приказа d (a, b) дерево с =d/2 ⌉ и b = d. Так как мы обсудили

стандартный вопрос карты и методы обновления для (a, b) деревья выше, мы ограничиваем наш

обсуждение здесь к сложности ввода/вывода B-деревьев.

Рисунок 14.6: B-дерево приказа 6.

Важная собственность B-деревьев состоит в том, что мы можем выбрать d так, чтобы d детские ссылки и d- 1 ключ, сохраненный в узле, могли все вписаться в единственный дисковый блок,

допущение, что d пропорционален B. Этот выбор позволяет нам принимать это a и

b также пропорциональны B в анализе поиска и обновляют операции на (a, b) деревья. Таким образом f (b) и g (b) оба O (1), потому что каждый раз мы получаем доступ к узлу, чтобы выполнить поиск или операцию по обновлению, мы должны только выполнить единственную дисковую передачу.

Как мы уже заметили выше, каждый поиск или обновление требуют, чтобы мы исследовали в большей части O (1) узлы для каждого уровня дерева. Поэтому, любая операция по поиску или обновлению карты на B-дереве требует только O (logd/2 n), то есть, O (зарегистрируйте регистрацию n/B),

дисковые передачи. Например, операция по вставке продолжается вниз B-дерево, чтобы определить местонахождение узла, в который можно вставить новый вход. Если узел overflows (чтобы иметь d + 1 ребенок) из-за этого дополнения, то этот узел разделен на два узла, которые имеют

⌊ (d + 1)/2 ⌋ и⌈ (d + 1)/2 ⌉ дети, соответственно. Этот процесс тогда повторен

в следующем выравнивают, и продолжается для в большей части O (logB n) уровни.

Аналогично, если удалить операция приводит к узлу underflow (чтобы иметьd/2 ⌉- 1

дети), тогда мы перемещаем ссылки от узла родного брата с, по крайней мере, d/2 ⌉ + 1

дети или мы должны выполнить операцию по сплаву этого узла с его родным братом (и

повторите это вычисление в родителе). Как с операцией по вставке, это продолжает B-дерево для в большей части O (logB n) уровни. Требование, что каждый внутренний узел

имеет, по крайней мере, d/2 ⌉, дети подразумевает, что каждый дисковый блок, используемый, чтобы поддержать B-дерево,

по крайней мере, наполовину полный. Таким образом у нас есть следующий.

Суждение 14.2: у B-дерева с n записями есть сложность ввода/вывода O (logB n) для поиска

или операция по обновлению и использование O (n/B) блоки, где B - размер блока.

14.4. Сортировка внешней памяти 683

14.4 Сортировка внешней памяти

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

Многоканальный вид слияния

Эффективный способ сортировать набор S объектов n во внешней памяти составляет sim - ple изменение внешней памяти на знакомом алгоритме вида слияния. Главная идея позади этого изменения состоит в том, чтобы слить много рекурсивно сортированных списков за один раз, таким образом сократив количество уровней рекурсии. Определенно, описание высокого уровня этого многоканального метода вида слияния должно разделить S на d подмножества S1, S2..., Sd примерно равного размера, рекурсивно вид каждое подмножество, Сай, и затем одновременно сливает весь d, сортировал списки в сортированное представление S. Если мы можем выполнить слияние про - налог, используя только O (n/B) дисковые передачи, то для достаточно больших ценностей n общее количество передач, выполненных этим алгоритмом, удовлетворяет следующее повторение

t (n) = d t (n/d) + cn/B,

для некоторого постоянного c³ 1. Мы можем остановить рекурсию, когда n£ B, так как мы можем

выполните единственную блочную пересылку в этом пункте, получив все объекты во внутренний

память, и затем сортирует набор с эффективным алгоритмом внутренней памяти. Таким образом останавливающийся критерий t (n)

t (n) = 1 если n/B1£. Это подразумевает решение закрытой формы, что t (n) является O ((n/B) logd (n/B)), который является

O ((n/B) регистрация (n/B) / регистрируют d).

Таким образом, если мы можем выбрать d, чтобы бытьQ (M/B), тогда худший номер дела блочных пересылок, выполненных этим многоканальным алгоритмом вида слияния, довольно низкий. Мы выбираем

d = (1/2) M/B.

Единственный аспект этого алгоритма, оставленного определить, - то, как выполнить d-путь слияние, используя только O (n/B) блочные пересылки.