В информатике, a graph - это абстрактный тип данных, который предназначен для реализации концепций неориентированного графа и ориентированного графа из области теории графов в рамках математики.
Структура данных графа состоит из конечного (и, возможно, изменяемого) набора вершин (также называемых узлами или точек) вместе с набором неупорядоченных пар этих вершин для неориентированного графа или набором упорядоченных пар для ориентированного графа. Эти пары называются ребрами (также называемыми связями или линиями), а для ориентированного графа также называются стрелками. Вершины могут быть частью структуры графа или могут быть внешними объектами, представленными целочисленными индексами или ссылками.
Структура данных графа также может связывать с каждым ребром некоторое значение ребра, такое как символическая метка или числовой атрибут (стоимость, вместимость, длина и т. д.).
Основные операции, предоставляемые структурой данных графа G, обычно включают:
смежный
(G, x, y): проверяет, есть ли ребро от вершины x до вершина y;соседи
(G, x): перечисляет все вершины y, у которых есть ребро от вершины x до вершины y;add_vertex
(G, x): добавляет вершина x, если ее нет;remove_vertex
(G, x): удаляет вершину x, если она есть;add_edge
(G, x, y): добавляет ребро из вершины x в вершину y, если ее нет;remove_edge
(G, x, y): удаляет ребро из вершины x в вершину y, если она есть;get_vertex_value
(G, x): возвращает значение, связанное с вершиной x;set_vertex_value
(G, x, v): устанавливает значение, связанное с вершиной x, равным v.Структуры th при значениях, связанных с краями, обычно также предоставляют:
get_edge_value
(G, x, y): возвращает значение, связанное с краем (x, y);set_edge_value
(G, x, y, v): устанавливает значение, связанное с ребром (x, y), равным v.На практике используются разные структуры данных для представления графов:
В следующей таблице даны временная сложность затраты на выполнение различных операций с графами для каждого из этих представлений с | V | количество вершин и | E | количество ребер. В матричных представлениях записи кодируют стоимость следования за ребром. Стоимость отсутствующих ребер предполагается равной ∞.
Список смежности | Матрица смежности | Матрица инцидентности | |
---|---|---|---|
График хранения | |||
Добавить вершину | |||
Добавить край | |||
Удалить вершину | |||
Удалить край | |||
Смежны ли вершины x и y (при условии, что их позиции хранения известны)? | |||
Замечания | Медленно удаляет вершины и ребра, потому что необходимо найти все вершины или ребра | Медленно добавлять или удалять вершины, потому что матрица должна быть изменена / скопирована | Медленно добавлять или удалять вершины и ребра, потому что размер матрицы должен быть изменен / скопирован. |
Списки смежности обычно предпочтительны, поскольку они эффективно представляют разреженные графы. Матрица смежности предпочтительна, если граф плотный, то есть количество ребер | E | близко к числу вершин в квадрате, | V |, или если нужно иметь возможность быстро найти, есть ли ребро, соединяющее две вершины.
Распараллеливание Проблемы с графами сталкиваются со значительными проблемами: вычисления, управляемые данными, неструктурированные проблемы, плохая локальность и высокий коэффициент доступа к данным к вычислениям. Представление графа, используемое для параллельных архитектур, играет важную роль в решении этих проблем. Плохо выбранные представления могут излишне увеличить стоимость связи алгоритма, что снизит его масштабируемость. Далее рассматриваются архитектуры с разделяемой и распределенной памятью.
В случае модели разделяемой памяти графические представления, используемые для параллельной обработки, такие же, как и в последовательном случае, поскольку параллельное только чтение доступ к представлению графа (например, к списку смежности ) эффективен в разделяемой памяти.
В модели распределенной памяти обычный подход заключается в разбиении набора вершин графика в устанавливает . Здесь - количество доступных обрабатывающих элементов (PE). Разделы набора вершин затем распределяются между PE с совпадающим индексом в дополнение к соответствующим ребрам. Каждый PE имеет собственное представление подграфа, где ребра с конечной точкой в другом разделе требуют особого внимания. Для стандартных интерфейсов связи, таких как MPI, должен быть идентифицирован идентификатор PE, владеющего другой конечной точкой. Во время вычислений в алгоритмах распределенного графа передача информации по этим ребрам подразумевает обмен информацией.
Разбиение графа должно выполняться осторожно - существует компромисс между низким уровнем коммуникации и разделением по размеру. Но разделение графа - это сложная задача. NP-сложная задача, поэтому рассчитать их нереально. Вместо этого используются следующие эвристики.
1D-разбиение: каждый процессор получает вершин и соответствующие исходящие ребра. Это можно понимать как разложение матрицы смежности по строкам или столбцам. Для алгоритмов, работающих с этим представлением, это требует шага связи «Все ко всем», а также размеры буфера сообщений, поскольку каждый PE потенциально имеет исходящие ребра для каждого другого PE.
2D-разбиение: каждый процессор получает подматрицу матрицы смежности. Предположим, что процессоры выровнены по прямоугольнику , где и - количество обрабатываемых элементов в каждой строке и столбце соответственно. Затем каждый процессор получает подматрицу матрицы смежности размерности . Это можно представить в виде шаблона шахматной доски в матрице. Следовательно, каждый блок обработки может иметь выходящие ребра к PE только в одной строке и столбце. Это ограничивает количество партнеров по обмену данными для каждого PE до из возможные.
На Викискладе есть носители, связанные с Graph (абстрактный тип данных). |