Обход графа внешней памяти
Обход графа внешней памяти — это тип обхода графа , оптимизированный для доступа к внешне хранимой памяти.
Фон
[ редактировать ]Обход графа — это подпрограмма в большинстве графовых алгоритмов. Цель алгоритма обхода графа — посетить (и/или обработать) каждый узел графа. Алгоритмы обхода графа, такие как поиск в ширину и поиск в глубину , анализируются с использованием модели фон Неймана , которая предполагает равномерную стоимость доступа к памяти. Эта точка зрения игнорирует тот факт, что в огромных экземплярах часть графа находится на диске, а не во внутренней памяти. Поскольку доступ к диску происходит намного медленнее, чем доступ к внутренней памяти, существует необходимость эффективного обхода внешней памяти .
Модель внешней памяти
[ редактировать ]Для алгоритмов внешней памяти модель внешней памяти Аггарвала и Виттера [1] используется для анализа. Машина задается тремя параметрами M , B и D. : M — размер внутренней памяти, B — размер блока диска, а D — количество параллельных дисков. Мерой производительности алгоритма внешней памяти является количество операций ввода-вывода, которые он выполняет.
Поиск в ширину внешней памяти
[ редактировать ]Алгоритм поиска в ширину начинается с корневого узла и проходит каждый узел с глубиной один. Если на текущей глубине больше нет непосещенных узлов, пройдут узлы на большей глубине. В конце концов, каждый узел графа был посещен.
Мунагала и Ранаде
[ редактировать ]Для неориентированного графа , Мунагала и Ранаде [2] предложил следующий алгоритм внешней памяти:
Позволять обозначим узлы на уровне поиска в ширину t и пусть быть мультимножеством соседей уровня t-1. Для каждого т, может быть построен из путем преобразования его в набор и исключения из него ранее посещенных узлов.
- Создавать путем доступа к списку смежности каждой вершины в . Этот шаг требует Ввод/вывод.
- Следующий создан из путем удаления дубликатов. Этого можно добиться путем сортировки , за которым следует этап сканирования и уплотнения, требующий Ввод/вывод.
- рассчитывается путем параллельного сканирования и и требует Ввод/вывод.
Общее количество операций ввода-вывода этого алгоритма следует с учетом того, что и и есть .
Визуализация трех описанных шагов, необходимых для вычисления L ( t ), изображена на рисунке справа.
Мельхорн и Мейер
[ редактировать ]Мельхорн и Мейер [3] предложил алгоритм, основанный на алгоритме Мунагалы и Ранаде (MR) и улучшающий их результат.
Он состоит из двух этапов. На первом этапе граф предварительно обрабатывается, на втором этапе выполняется поиск в ширину с использованием информации, собранной на первом этапе.
На этапе предварительной обработки граф разбивается на несвязанные подграфы. с небольшим диаметром. Далее он соответствующим образом разделяет списки смежности, создавая внешний файл , где содержит список смежности для всех узлов в .
Фаза поиска в ширину аналогична алгоритму MR. алгоритм поддерживает отсортированный внешний файл H. Кроме того , Этот файл инициализируется с помощью . Кроме того, узлы любого созданного уровня поиска в ширину содержат идентификаторы файлов. соответствующих подграфов . Вместо использования произвольного доступа для создания файл H. используется
- Выполнить параллельное сканирование отсортированного списка и Х. Извлеките списки смежности для узлов , это можно найти в H .
- списки смежности для остальных узлов, которые не удалось найти в H. Необходимо получить Сканирование закончено возвращает идентификаторы разделов. После сортировки и удаления дубликатов соответствующие файлы могут быть объединены во временный файл F' .
- Недостающие списки смежности можно извлечь из F' с помощью сканирования. Затем оставшиеся списки смежности объединяются в H за один проход.
- создается путем простого сканирования. Информация о разделе прикреплена к каждому узлу в .
- Алгоритм аналогичен алгоритму MR.
Ребра могут сканироваться чаще в H , но количество неструктурированных операций ввода-вывода для получения списков смежности сокращается.
Общее количество операций ввода-вывода для этого алгоритма равно
Поиск в глубину внешней памяти
[ редактировать ]Алгоритм поиска в глубину исследует граф вдоль каждой ветви как можно глубже перед обратным отслеживанием.
Для ориентированных графов Бухсбаума, Гольдвассера, Венкатасубраманиана и Вестбрука. [4] предложил алгоритм с Ввод/вывод.
Этот алгоритм основан на структуре данных, называемой деревом буферизованного репозитория (BRT). Он хранит множество элементов из упорядоченной вселенной. Элементы идентифицируются по ключу. БТР предлагает две операции:
insert(T, x)
, который добавляет элемент x к T и требует амортизированные входы/выходы. N — количество предметов, добавленных в БТР.extract(T, k)
, который сообщает и удаляет из T все элементы с ключом k . Это требует Ввод-вывод, где S — размер набора, возвращаемого экстрактом .
Алгоритм имитирует внутренний алгоритм поиска в глубину. Стек S узлов удерживается. Во время итерации узла v поверх S поместите непосещенного соседа на S и выполните итерацию. Если непосещенных соседей нет, pop v .
Трудность состоит в том, чтобы определить, является ли узел непосещенным, не делая Число операций ввода-вывода на каждое ребро. Для этого для узла v входящие ребра помещаются в BRT D при v первом обнаружении . Далее, исходящие ребра ( v , x ) помещаются в приоритетную очередь P ( v ), определяемую рангом в списке смежности.
Для вершины u вершине S все ребра ( u , x ) извлекаются из D. на Такие ребра существуют только в том случае, если x был обнаружен с момента последнего нахождения u на вершине S (или с момента запуска алгоритма, если u впервые оказался на вершине S ). Для каждого ребра ( u , x ) операция удаления ( x ) выполняется над P ( u ). Наконец, операция удаления мин на дает следующий непосещенный узел. Если P ( u ) пусто, u извлекается из S .
Псевдокод этого алгоритма приведен ниже.
1 procedure BGVW-depth-first-search(G, v): 2 let S be a stack, P[] a priority queue for each node and D a BRT 3 S.push(v) 4 while S is not empty: 5 v := S.top() 6 if v is not marked: 7 mark(v) 8 extract all edges (v, x) from D, ∀x: P[v].delete(x) 9 if (u := P[v].delete-min()) is not null: 10 S.push(u) 11 else: 12 S.pop() 13 procedure mark(v) 14 put all edges (x, v) into D 15 ∀ (v, x): put x into P[v]
Ссылки
[ редактировать ]- ^ Аггарвал, Алок; Виттер, Джеффри (1988). «Сложность ввода/вывода сортировки и связанные с ней проблемы» . Коммуникации АКМ . 31 (9): 1116–1127. дои : 10.1145/48529.48535 .
- ^ Мунагала, Камешвар; Ранаде, Абхирам (1999). «I/O-сложность графовых алгоритмов». Материалы десятого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам . СОДА '99. Балтимор, Мэриленд, США: Общество промышленной и прикладной математики. стр. 687–694.
- ^ Мельхорн, Курт; Мейер, Ульрих (2002). «Поиск в ширину во внешней памяти с сублинейным вводом-выводом». Алгоритмы -- ЕКА 2002 . ЕКА 2002. Рим, Италия: Springer Berlin Heidelberg. стр. 723–735.
- ^ Бухсбаум, Адам Л.; Гольдвассер, Майкл; Венкатасубраманиан, Майкл; Уэстбрук, Суреш (2000). «Об обходе графа внешней памяти». Материалы одиннадцатого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам . СОДА '00. Сан-Франциско, Калифорния, США: Общество промышленной и прикладной математики. стр. 859–860.