В информатике граф — это абстрактный тип данных , который предназначен для реализации понятий неориентированного графа и ориентированного графа из области теории графов в математике .
Структура данных графа состоит из конечного (и, возможно, изменяемого) набора вершин (также называемого узлами или точками ) вместе с набором неупорядоченных пар этих вершин для неориентированного графа или набора упорядоченных пар для ориентированного графа . Эти пары известны как ребра (также называемые ссылками или линиями ), а для ориентированного графа они также известны как ребра , а иногда и как стрелки или дуги . Вершины могут быть частью структуры графа или внешними объектами, представленными целочисленными индексами или ссылками .
Структура данных графа также может ассоциировать с каждым ребром некоторое значение ребра , например символическую метку или числовой атрибут (стоимость, емкость, длина и т. д.).
Основные операции, предоставляемые структурой данных графа G, обычно включают в себя: [1]
Структуры, которые связывают значения с краями, обычно также обеспечивают: [1]
В следующей таблице приведены временные затраты на выполнение различных операций над графами для каждого из этих представлений с | В | количество вершин и | Е | количество ребер. [ нужна цитация ] В матричных представлениях записи кодируют стоимость следования за ребром. Предполагается, что стоимость отсутствующих ребер равна ∞.
Списки смежности обычно предпочтительны для представления разреженных графов , тогда как матрица смежности предпочтительна, если граф плотный; то есть количество ребер | Е | близко к числу вершин в квадрате, | В | 2 , или если нужно иметь возможность быстро найти, есть ли ребро, соединяющее две вершины. [5] [6]
Временная сложность операций в представлении списка смежности может быть улучшена за счет хранения наборов соседних вершин в более эффективных структурах данных, таких как хеш-таблицы или сбалансированные двоичные деревья поиска (последнее представление требует, чтобы вершины идентифицировались элементами линейно упорядоченного списка). набор, например целые числа или строки символов). Представление соседних вершин через хеш-таблицы приводит к амортизированной средней временной сложности для проверки смежности двух заданных вершин и удалению ребра и амортизированной средней временной сложности [7] для удаления данной вершины x степени . Временная сложность других операций и требования к асимптотическому пространству не меняются.
Распараллеливание задач на графах сталкивается с серьезными проблемами: вычисления, управляемые данными, неструктурированные проблемы, плохая локальность и высокое соотношение доступа к данным и вычислений. [8] [9] Графическое представление, используемое для параллельных архитектур, играет важную роль в решении этих проблем. Плохо выбранные представления могут неоправданно увеличить стоимость связи алгоритма, что снизит его масштабируемость . Далее рассматриваются архитектуры с общей и распределенной памятью.
В случае модели с общей памятью представления графа, используемые для параллельной обработки, такие же, как и в последовательном случае, [10] поскольку параллельный доступ только для чтения к представлению графа (например, список смежности ) эффективен в общей памяти.
В модели распределенной памяти обычным подходом является разделение набора вершин графа на множества . Здесь – количество доступных обрабатывающих элементов (ПЭ). Разделы набора вершин затем распределяются по PE с совпадающим индексом, а также по соответствующим ребрам. Каждый PE имеет свое собственное представление подграфа , где ребра с конечной точкой в другом разделе требуют особого внимания. Для стандартных интерфейсов связи, таких как MPI , идентификатор PE, владеющего другой конечной точкой, должен быть идентифицируемым. Во время вычислений в алгоритмах распределенного графа передача информации по этим ребрам подразумевает связь. [10]
Разбиение графа необходимо выполнять осторожно — существует компромисс между низким уровнем взаимодействия и разделением по размеру [11] . Но разбиение графа — это NP-сложная задача, поэтому вычислить его невозможно. Вместо этого используются следующие эвристики.
1D-разделение: каждый процессор получает вершины и соответствующие исходящие ребра. Это можно понимать как разложение матрицы смежности по строкам или по столбцам. Для алгоритмов, работающих с этим представлением, это требует шага связи «Все ко всем», а также размеров буфера сообщений, поскольку каждый PE потенциально имеет исходящие ребра к каждому другому PE. [12]
2D-разделение: каждый процессор получает подматрицу матрицы смежности. Предположим, что процессоры выровнены в прямоугольнике , где и — количество обрабатывающих элементов в каждой строке и столбце соответственно. Затем каждый процессор получает подматрицу матрицы смежности размерности . Это можно представить в виде шахматной доски в матрице. [12] Таким образом, каждый процессор может иметь исходящие ребра к PE только в одной и той же строке и столбце. Это ограничивает количество коммуникационных партнеров для каждого PE из возможных .
Графы с триллионами ребер встречаются в машинном обучении , анализе социальных сетей и других областях. Сжатые графические представления были разработаны для уменьшения требований к вводу-выводу и памяти. Применимы общие методы, такие как кодирование Хаффмана , но список смежности или матрица смежности могут обрабатываться особыми способами для повышения эффективности. [13]
Поиск в ширину (BFS) и поиск в глубину (DFS) — это два тесно связанных подхода, которые используются для исследования всех узлов в данном связном компоненте . Оба начинаются с произвольного узла, « корня ». [14]