Граф (абстрактний тип даних)

Орієнтований граф з трьома вершинами (сині кола) та трьома ребрами (чорні стрілки).

В інформатиці граф — це абстрактний тип даних, який призначений для реалізації концепцій неорієнтованого і орієнтованого графів, які походять з математики, а саме, з теорії графів.

Структура даних графів складається зі скінченної (можливо, змінної) множини вершин (також, вони можуть називатися вузлами або точками) разом із множиною невпорядкованих пар цих вершин для неорієнтованого графу або множини впорядкованих пар для орієнтованого графу. Ці пари відомі як ребра (їх також називають зв'язками або відрізками), а для орієнтованого графу також відомі як стрілки. Вершини можуть бути частиною структури графу, або можуть бути зовнішніми об'єктами, представленими цілими індексами або посиланнями.

Структура даних у графах також може пов'язувати з кожним ребром якесь значення ребра, таке як символьний або числовий атрибут (вартість, місткість, довжина, тощо).

Основні операції, передбачені структурою даних графів G:[1]

  • суміжність(G, x, y): перевіряє наявність ребра між вершиною x та вершиною y;
  • сусідство(G, x): перераховує всі вершини y такі, які мають ребро з вершиною x;
  • додати_вершину(G, x): додає вершину x, якщо її немає;
  • видалити_вершину(G, x): видаляє вершину x, якщо вона є;
  • додати_ребро(G, x, y): додає ребро від вершини x до вершини y, якщо його немає;
  • видалити_ребро(G, x, y): видаляє ребро від вершини x до вершини y, якщо воно є;
  • отримати_значення_вершини(G, x): повертає значення, пов'язане з вершиною x ;
  • задати_значення_вершини(G, x, v): встановлює значення, пов'язане з вершиною x на v .

Структури, які приписують значення ребрам:[1]

  • отримати_значення_ребра(G, x, y): повертає значення, пов'язане з ребром (x, y);
  • задати_значення_ребра(G, x, y, v): встановлює значення, пов'язане з ребром (x, y), на v.

На практиці використовуються різні структури даних для представлення графів:

Список суміжності[en][2]
Вершини зберігаються у вигляді записів або об'єктів, і кожна вершина зберігає список суміжних вершин. Ця структура даних дозволяє зберігати додаткові дані у вершинах. Додаткові дані можуть бути збережені, якщо ребра також збережені як об'єкти, і в цьому випадку кожна вершина зберігає інцидентні їй ребра, а кожне ребро зберігає інцидентні йому вершини.
Матриця суміжності[3]
Двовимірна матриця, в якій рядки представляють початкові вершини, а стовпці — кінцеві вершини. Дані про ребра та вершини повинні зберігатися окремо. Між кожною парою вершин може зберігатися лише одне ребро.
Матриця інцидентності[4]
Двовимірна булева матриця, в якій рядки представляють вершини, а стовпці — ребра. Записи вказують, чи буде вершина в рядку інцидентною ребру у стовпчику.

У наступній таблиці наведена часову складність для виконання різних операцій над графами з |V | кількістю вершин і |Е | кількістю ребер залежно від способу представлення. У матричних представленнях записи дають вартість операції для наступного ребра. Вартість для ребер, яких немає, вважається нескінченною.

Список суміжності Матриця суміжності Матриця інцидентності
Зберігати граф
Додати вершину
Додати ребро
Видалити вершину
Видалити ребро
Чи суміжні вершини x і y (якщо вважати, що місця їх зберігання відомі)?
Зауваження Повільно видаляє вершини та ребра, тому що потрібно знаходити всі вершини чи ребра Повільно додає або видаляє вершини, тому що матрицю потрібно змінювати розмір/копіювати Повільно додає або видаляє вершини та ребра, тому що матрицю потрібно змінювати розмір/копіювати

Списки суміжності зазвичай є ефективнішими, оскільки вони краще представляють розріджені графи. Матриця суміжності є ефективнішою, якщо граф є щільним, тобто кількість ребер |Е| близька до квадрату кількості вершин — |V|2, або якщо потрібно швидко знайти ребро, яке з'єднує дві вершини.[5][6]

  1. а б Див., наприклад Goodrich та Tamassia, (2015), Section 13.1.2: Operations on graphs, p. 360. Для більш детального набору операцій, див. Mehlhorn, K.; Näher, S. (1999). Chapter 6: Graphs and their data structures. LEDA: A platform for combinatorial and geometric computing. Cambridge University Press. с. 240–282. 
  2. Cormen та ін., (2001), pp. 528—529; Goodrich та Tamassia, (2015), pp. 361—362.
  3. Cormen та ін., (2001), pp. 529—530; Goodrich та Tamassia, (2015), p. 363.
  4. Cormen та ін., (2001), Exercise 22.1-7, p. 531.
  5. Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2001) [1990]. Section 22.1: Representations of graphs. Вступ до алгоритмів (вид. 2nd). MIT Press і McGraw-Hill. с. 527–531. ISBN 0-262-03293-7. .
  6. Goodrich, Michael T.; Tamassia, Roberto (2015). Section 13.1: Graph terminology and representations. Algorithm Design and Applications. Wiley. с. 355–364. .

Copyright