Списък на съседство и матрично представяне на графика

⚡ Умно обобщение

Списъкът на съседство и матричното представяне на графа съхраняват върховете и ребрата в паметта, което позволява на алгоритмите да преминават през мрежи. Списъкът на съседство използва свързани списъци за връх, докато матрицата на съседство използва квадратна двуизмерна мрежа.

  • 📐 Списък със съседни места: Масив от V свързани списъци, където всеки списък с индекс i съхранява всеки връх, съседен на връх i, което дава O(V + E) памет.
  • Матрица на съседство: Двумерен масив AV × V, където матрица[i][j] съдържа теглото на ръба или 1, когато съществува ръб между връх i и връх j.
  • Скорост на търсене: Матрицата на съседство отговаря на въпроса „има ли ръб между i и j?“ за време O(1), докато списъкът на съседство се нуждае от време O(степен) за сканиране на списъка със съседи.
  • 💾 Памет: Матрицата на съседство винаги изразходва O(V²) памет, дори за разредени графове, докато списъкът на съседство се мащабира с действителния брой ребра.
  • 🔍 Най-подходящо: Изберете матрицата на съседство за плътни графове с чести заявки към ръбове и списъка на съседство за разредени графове и натоварвания с голямо обхождане.
  • 🛠️ Приложения: И двете представяния захранват BFS, DFS, Dijkstra, PageRank, маршрутизиране по пътна мрежа и конвейери на графични невронни мрежи, използвани в системи с изкуствен интелект.

Списък на съседство и матрично представяне на графика

Въпреки че изглеждат различни, всички видове графики може да се представи по подобен начин. Обикновено има два вида графично представяне:

  1. Матрица на съседство
  2. Списък на съседство

Списък на съседство

Списъкът на съседство се състои от свързани списъци. Всеки връх се счита за индекс на масив, а всеки елемент представлява свързан списък. Тези свързани списъци съдържат върховете, които споделят ребро с индексния връх.

Ето пример за списък на съседство:

Списък на съседство

Нека графът съдържа V брой върхове и E брой ребра. Пространствената сложност на списъка на съседство е O(V + E), който се мащабира с броя на реалните ръбове, а не с всяка възможна двойка върхове.

Най-лошият случай на пространствена сложност става O(V²) ако даденият граф е пълен граф, тъй като всеки връх е свързан с всеки друг връх.

Матрица на съседство

Матрицата на съседство е съставена от 2D масив. За граф с V върха, размерът на матрицата ще бъде V × V.

Казвам matrix[i][j] = 5Това означава, че има ръб между възел i и възел j, където теглото е 5.

Нека разгледаме следната графика и нейната матрица на съседство:

Матрица на съседство

Ние изградихме 2D масив използвайки тези стъпки:

Стъпка 1) Връх A има директен ръб с B, а теглото е 5. Следователно, клетката в ред A и колона B ще бъде запълнена с 5. Останалите клетки в ред A ще бъдат запълнени с нула.

Стъпка 2) Връх B има директен ръб с C, а теглото е 4. Следователно, клетката в ред B и колона C ще бъдат запълнени с 4. Останалите клетки в ред B ще бъдат запълнени с нула, тъй като B няма изходящ ръб към друг възел.

Стъпка 3) Върхът C няма директни ръбове с други върхове. Следователно, ред C ще бъде запълнен с нули.

Стъпка 4) Върхът D има насочен ръб с A и C.

  • Клетката в ред D и колона A ще има стойност 7. Клетката в ред D и колона C ще има стойност 2.
  • Останалите клетки в ред D ще бъдат запълнени с нули.

Стъпка 5) Върхът E има насочен ръб с B и D. Клетката в ред E и колона B ще има стойност 6. Клетката в ред E и колона D ще има стойност 3. Останалите клетки в ред E ще бъдат запълнени с нули.

Ето някои точки, които трябва да обърнете внимание:

  • Графиката няма самоциклични цикли, когато основният диагонал на матрицата на съседство е 0.
  • Графиката е насочена, ако клетките в (a, b) и (b, a) не съдържат една и съща стойност. В противен случай графиката е ненасочена.
  • Графиката е претеглена графика, ако стойността на която и да е клетка е по-голяма от 1.

Основният проблем с матрицата на съседство е, че тя изисква квадратно пространство. Дори ребра, които не съществуват, все още разпределят клетки в паметта.

Например, ако имаме граф със 100 възела, тогава са необходими 10 000 клетки, за да се съхранява в него. RAMС по-малко ръбове в графа, разпределянето на толкова голяма памет може да бъде разточително. Така че пространствената сложност, използваща матрицата на съседство, е O(N²), където N е броят на възлите в графа.

Списък на съседство срещу Матрица на съседство

Преди да изберете представяне, е полезно да сравните двата модела един до друг в операциите, които доминират в реалните графични натоварвания:

OperaАЦИМатрица на съседствоСписък на съседство
Сложност на пространствотоO(V²)O(V + E)
Добавяне на връхO(V²)O (1)
Добавете ръбO (1)O (1)
Премахване на ръбO (1)O(E)
Проверка дали ръб (i, j) съществуваO (1)O (степен на i)
Итерация върху съседите на iO(V)O (степен на i)
Най - доброто заПлътни графи, чести заявки към ръбовеРазредени графи, задачи с голямо търсене

Накратко, матрицата на съседство печели при търсения на ръбове за постоянно време, докато списъкът на съседство печели при итерации на паметта и съседите, поради което алгоритми като BFS, DFS и Dijkstra обикновено се съчетават със списъци на съседство.

Предимства и недостатъци на графичното представяне

Всяко представяне носи своите недостатъци. Познаването на силните и слабите страни на двата модела ви помага да изберете правилния за проблема, който решавате.

Предимства на матрицата на съседство:

  • Запитвания за съществуване на ръбове между произволна двойка върхове с константно време O(1).
  • Фиксираното индексиране прави матрично-базирани алгоритми, като например Флойд-Уоршал и транзитивно затваряне, лесни за изпълнение.
  • Претеглените ръбове се вписват естествено в една матрична клетка.

Недостатъци на матрицата на съседство:

  • Загубва O(V²) памет, когато графиката е разредена.
  • Добавянето на нов връх изисква преоразмеряване на цялата матрица.
  • Итерирането върху съседите на един връх отнема O(V), дори когато върхът има само няколко ребра.

Предимства на списъка за съседство:

  • Използва само O(V + E) памет, което е близко до реалния брой ръбове в разредени графове.
  • Добавянето на нов връх или ръб е O(1).
  • Алгоритми за обхождане, като BFS и DFS, итерират съседите в O(степен), което дава общо време за изпълнение O(V + E).

Недостатъци на списъка за съседство:

  • Проверката дали съществува специфичен ръб отнема време O(градус) вместо O(1).
  • Локалността на кеша е по-слаба, защото свързаните списъци са разпръснати из паметта.
  • Претеглените ръбове се нуждаят от съпътстващо поле или списък от двойки, което леко усложнява структурата на данните.

Кога да използвате списък на съседство спрямо матрица на съседство

Изборът на представяне зависи от плътността на графиката и операциите, които изпълнявате най-често. Използвайте това кратко ръководство, за да изберете правилната структура:

  • Предпочитайте матрицата на съседство когато графът е плътен (E е близо до V²), когато ръбовете рядко се променят и когато алгоритъмът ви пита многократно „има ли ръб между i и j?“.
  • Предпочитайте списъка със съседни позиции когато графът е разреден (E е много по-малко от V²), когато множеството от върхове или ръбове расте по време на изпълнение и когато обхождате графа с BFS, DFS или Алгоритъмът за най-къс път на Дейкстра.
  • Предпочитайте смесен модел (списък на съседни обекти плюс хеш набор от ръбове), когато се нуждаете както от бърза итерация на съседи, така и от O(1) заявки за ръбове, за сметка на допълнителна памет.

Съвременните графови библиотеки като NetworkX и igraph по подразбиране използват списъци със съседни данни, защото повечето графи от реалния свят – социални мрежи, пътни карти, уеб страници, зависимости на пакети – са разредени и изискват много преминаване.

Въпроси и Отговори

Списъкът на съседство е масив от V свързани списъци, където всеки списък с индекс i съхранява всеки връх, съседен на връх i. Използването на памет е O(V + E), което е подходящо за разредени графове и алгоритми за обхождане като BFS и DFS.

Матрицата на съседство е двумерен масив с размер V × V, където матрица[i][j] съдържа теглото на реброто или 1, ако съществува ребро между върха i и върха j. Търсенето на реброто е O(1), но паметта винаги е O(V²).

Матрицата на съседство отговаря на запитванията за съществуване на ръбове за O(1). Списъкът на съседство итерира съседите за O(степен), което е по-бързо за алгоритми за обхождане като BFS, DFS и Dijkstra. Най-добрият избор зависи от операциите, които доминират в работното ви натоварване.

Използвайте списък на съседни графове, когато графът е разреден, когато върховете и ребрата се променят по време на изпълнение и когато алгоритъмът често пресича съседи. Социалните мрежи, пътните карти и графите на уеб страниците отговарят на този профил.

Използвайте матрица на съседство, когато графът е плътен, когато множеството от върхове е фиксирано и когато алгоритъмът многократно проверява един и същ ръб. Математиката на Флойд-Уоршал и транзитивното затваряне работят естествено върху матрици на съседство.

Да. За насочените графи матрицата не е симетрична и списъкът съхранява само изходящи съседи. За претеглените графи клетката на матрицата съдържа теглото, докато списъкът съхранява двойки съсед и тегло.

Графовите невронни мрежи подават матрици на съседство или тензори на разредени ръбове в слоевете за машинно обучение за откриване на измами, прогнозиране на свойствата на молекулите и системи за препоръки. Графите на знанието също разчитат на кодиране на списъци със съседство за изкуствен интелект, допълнен с търсене.

Да. GitHub Copilot и ChatGPT генерират списък за съседство и шаблонна матрица за Python, C++, и JavaРазработчиците все още трябва да проверяват гранични случаи, като например дублиращи се ръбове, самоциклични графи и правилно боравене с насочени или претеглени графи.

Обобщете тази публикация с: