java graph tutorial how implement graph data structure
Цей вичерпний підручник з графіків Java детально пояснює структуру даних графіків. Вона включає в себе створення, реалізацію, репрезентацію та обхід графіків на Java:
Графічна структура даних в основному представляє мережу, що з'єднує різні точки. Ці точки називаються вершинами, а зв'язки, що з'єднують ці вершини, називаються 'Краями'. Отже, графік g визначається як набір вершин V та ребер E, що з’єднують ці вершини.
Графіки в основному використовуються для представлення різних мереж, таких як комп'ютерні мережі, соціальні мережі тощо. Вони також можуть використовуватися для представлення різних залежностей у програмному забезпеченні або архітектурах. Ці графіки залежностей дуже корисні для аналізу програмного забезпечення, а також часом його налагодження.
=> Перевірте ВСІ підручники Java тут.
Що ви дізнаєтесь:
- Структура даних графіків Java
- Як створити графік?
- Впровадження графіків в Java
- Бібліотека графіків Java
- Висновок
Структура даних графіків Java
Нижче наведено графік із п'ятьма вершинами {A, B, C, D, E} та ребрами, заданими {{AB}, {AC}, {AD}, {BD}, {CE}, {ED}}. Оскільки ребра не показують жодних напрямків, цей графік відомий як „ненаправлений графік“.

Окрім неорієнтованого графіка, показаного вище, у Java є кілька варіантів графіка.
Давайте детально обговоримо ці варіанти.
Різні варіанти графіка
Нижче наведено деякі варіанти графіка.
# 1) Направлений графік
Спрямований графік або диграф - це структура даних графіка, в якій ребра мають певний напрямок. Вони беруть початок з однієї вершини, а завершуються іншою вершиною.
На наступній схемі показаний приклад спрямованого графіка.

На наведеній вище діаграмі є ребро від вершини A до вершини B. Але зауважте, що A до B не є таким, як B до A, як у непрямому графіку, якщо немає ребра, зазначеного від B до A.
Спрямований графік циклічний, якщо є принаймні один шлях, у якого перша і остання вершини однакові. На наведеній вище схемі шлях A-> B-> C-> D-> E-> A утворює спрямований цикл або циклічний графік.
І навпаки, спрямований ациклічний графік - це графік, у якому немає спрямованого циклу, тобто немає шляху, який утворює цикл.
# 2) Зважений графік
У зваженому графіку - гиряасоціюється з кожним ребром графіка. Вага зазвичай вказує на відстань між двома вершинами. На наступній схемі показаний зважений графік. Оскільки ніяких вказівок не показано, це неорієнтований графік.

Зверніть увагу, що зважений графік може бути спрямованим або ненаправленим.
Як створити графік?
Java не забезпечує повноцінної реалізації структури даних графіків. Однак ми можемо представити графік програмно, використовуючи Колекції в Java. Ми також можемо реалізувати графік, використовуючи динамічні масиви, такі як вектори.
Зазвичай ми реалізуємо графіки на Java за допомогою колекції HashMap. Елементи HashMap мають форму пар 'ключ-значення'. Ми можемо представити список суміжності графіків у HashMap.
Найпоширеніший спосіб створити графік - це використання одного з подань графіків, таких як матриця суміжності або список суміжностей. Далі ми обговоримо ці подання, а потім реалізуємо графік на Java, використовуючи список суміжностей, для якого будемо використовувати ArrayList.
Представлення графіків у Java
Подання графіків означає підхід або техніку, за допомогою якої дані графіків зберігаються в пам’яті комп’ютера.
Ми маємо два основних подання графіків, як показано нижче.
Матриця суміжності
Матриця суміжності - це лінійне представлення графіків. Ця матриця зберігає відображення вершин і ребер графіка. У матриці суміжності вершини графіка представляють рядки та стовпці. Це означає, що якщо графік має N вершин, то матриця суміжності матиме розмір NxN.
Якщо V - набір вершин графа, то перетин Mijу списку суміжності = 1 означає, що між вершинами i та j існує ребро.
Щоб чіткіше зрозуміти цю концепцію, давайте підготуємо матрицю суміжності для неорієнтованого графіка.
Як видно з наведеної вище схеми, ми бачимо, що для вершини A перетини AB і AE встановлені в 1, оскільки існує ребро від A до B і A до E. Аналогічним чином перетин BA встановлений до 1, оскільки це неспрямоване графік і AB = BA. Подібним чином ми встановили всі інші перехрестя, для яких є ребро, рівне 1.
У випадку, якщо графік спрямований, перетин Мijбуде встановлено на 1, лише якщо є чітке ребро, спрямоване від Vi до Vj.
Це показано на наступному малюнку.
Як ми бачимо з наведеної діаграми, є ребро від А до В. Тож перетин АВ встановлено в 1, але перетин ВА - у 0. Це тому, що ребра, спрямованого від В до А, немає.
Розглянемо вершини E і D. Ми бачимо, що є ребра від E до D, а також від D до E. Отже, ми встановили обидва ці перетину на 1 в Матриці суміжності.
Тепер ми переходимо до зважених графіків. Як ми знаємо для зваженого графіка, ціле число, також відоме як вага, асоціюється з кожним ребром. Ми представляємо цю вагу в Матриці суміжності для ребра, який існує. Ця вага визначається, коли є ребро від однієї вершини до іншої замість '1'.
Це подання показано нижче.
Список суміжності
Замість того, щоб представляти графік як матрицю суміжності, яка є послідовною за своєю суттю, ми також можемо використовувати зв’язане представлення. Це пов'язане представлення відоме як список суміжностей. Список суміжності - це не що інше, як зв’язаний список, і кожен вузол у списку представляє вершину.
Наявність ребра між двома вершинами позначається покажчиком від першої вершини до другої. Цей список суміжностей підтримується для кожної вершини на графіку.
Коли ми об'їхали всі сусідні вузли для певного вузла, ми зберігаємо NULL у наступному полі вказівника останнього вузла списку суміжності.
Тепер ми будемо використовувати наведені вище графіки, які ми використовували для представлення матриці суміжності, щоб продемонструвати список суміжностей.
На наведеному малюнку наведено список суміжностей для непрямого графіку. Ми бачимо, що кожна вершина або вузол має свій список суміжності.
У випадку неорієнтованого графіка загальна довжина списків суміжності зазвичай вдвічі перевищує кількість ребер. На наведеному графіку загальна кількість ребер дорівнює 6, а загальна чи сума довжини всього списку суміжностей - 12.
Тепер давайте підготуємо список суміжностей для спрямованого графіка.
Як видно з наведеного малюнка, на спрямованому графіку загальна довжина списків суміжності графіка дорівнює кількості ребер на графіку. На наведеному графіку 9 ребер та сума довжин списків суміжності для цього графіку = 9.
Тепер розглянемо наступний зважений напрямлений графік. Зверніть увагу, що кожне ребро зваженого графіка пов’язане з вагою. Отже, коли ми представляємо цей графік зі списком суміжності, ми повинні додати нове поле до кожного вузла списку, яке буде позначати вагу ребра.
Список суміжностей для зваженого графіка наведено нижче.
На наведеній вище схемі показаний зважений графік та його список суміжностей. Зверніть увагу, що в списку суміжностей є новий пробіл, який позначає вагу кожного вузла.
Впровадження графіків в Java
Наступна програма показує реалізацію графіка на Java. Тут ми використали список суміжностей для представлення графіка.
import java.util.*; //class to store edges of the weighted graph class Edge { int src, dest, weight; Edge(int src, int dest, int weight) { this.src = src; this.dest = dest; this.weight = weight; } } // Graph class class Graph { // node of adjacency list static class Node { int value, weight; Node(int value, int weight) { this.value = value; this.weight = weight; } }; // define adjacency list List adj_list = new ArrayList(); //Graph Constructor public Graph(List edges) { // adjacency list memory allocation for (int i = 0; i Вихід:

Обхід графіків Java
Щоб виконати будь-яку значущу дію, як пошук наявності будь-яких даних, нам потрібно пройти графік таким чином, щоб кожна вершина та край графіка були відвідані принаймні один раз. Це робиться за допомогою алгоритмів графіків, які є не що інше, як набір інструкцій, які допомагають нам пройти графік.
Існує два алгоритми, які підтримуються для обходу графіка на Java .
- Обхід першої глибини
- Обхід по ширині
Обхід першої глибини
Пошук із глибиною (DFS) - це техніка, яка використовується для обходу дерева або графіка. Техніка DFS починається з кореневого вузла, а потім проходить сусідні вузли кореневого вузла, заглиблюючись у графік. У техніці DFS вузли проходять поглиблено, поки не буде більше дітей для дослідження.
операційні системи, які запускають програми Windows
Після того, як ми дійдемо до листового вузла (більше не буде дочірніх вузлів), DFS повернеться назад і почнеться з інших вузлів і здійснить обхід аналогічним чином. Техніка DFS використовує структуру даних стеку для зберігання вузлів, які проходять.
Далі наведено алгоритм для техніки DFS.
Алгоритм
Крок 1: Почніть з кореневого вузла та вставте його в стек
Крок 2: Витягніть предмет із стеку та вставте до списку «відвіданих»
Крок 3: Для вузла, позначеного як «відвіданий» (або у списку відвідуваних), додайте до стеку сусідні вузли цього вузла, які ще не позначені як відвідані.
Крок 4: Повторюйте кроки 2 і 3, поки стек не порожній.
Ілюстрація техніки DFS
Тепер ми проілюструємо техніку DFS на власному прикладі графіка.
Нижче наведено приклад графіка. Ми підтримуємо стек для зберігання досліджених вузлів і список для зберігання відвіданих вузлів.

Для початку ми почнемо з А, позначимо його як відвідане та додамо до списку відвідуваних. Тоді ми розглянемо всі сусідні вузли A і висунемо ці вузли на стек, як показано нижче.

Далі ми виймаємо вузол зі стека, тобто B, і позначаємо його як відвіданий. Потім ми додаємо його до списку 'відвіданих'. Це представлено нижче.

Тепер ми розглянемо сусідні вузли B, які є A і C. З цього A вже відвідано. Тож ми це ігноруємо. Далі висуваємо C з стека. Позначте C як відвідане. Сусідній вузол C, тобто E, додається до стека.

яка відповідна маска підмережі для мережі між двома хостами
Далі ми виймаємо наступний вузол E зі стеку та позначаємо його як відвіданий. Сусідній вузол E - це C, який вже відвідали. Тож ми це ігноруємо.

Тепер у стеку залишається лише вузол D. Тож ми відзначаємо це як відвідане. Сусідній вузол - А, який вже відвідали. Тому ми не додаємо його в стек.

На цей момент стек порожній. Це означає, що ми завершили обхід першої глибини для даного графіка.
Список відвідуваних дає остаточну послідовність обходу за допомогою техніки глибини першої. Кінцевою послідовністю DFS для наведеного графіку є A-> B-> C-> E-> D.
Впровадження DFS
import java.io.*; import java.util.*; //DFS Technique for undirected graph class Graph { private int Vertices; // No. of vertices // adjacency list declaration private LinkedList adj_list(); // graph Constructor: to initialize adjacency lists as per no of vertices Graph(int v) { Vertices = v; adj_list = new LinkedList(v); for (int i=0; i Вихід:

Застосування DFS
# 1) Визначте цикл на графіку: DFS полегшує виявлення циклу на графіку, коли ми можемо повернутися до ребра.
# 2) Визначення шляху: Як ми вже бачили на ілюстрації DFS, враховуючи будь-які дві вершини, ми можемо знайти шлях між цими двома вершинами.
# 3) Мінімум обшивне дерево та найкоротший шлях: Якщо ми запустимо техніку DFS на незваженому графіку, це дасть нам мінімальне дерево охоплення та короткий шлях.
# 4) Топологічне сортування: Топологічне сортування використовується, коли нам доводиться планувати завдання. У нас є залежність між різними робочими місцями. Ми також можемо використовувати топологічне сортування для вирішення залежностей між лінкерами, планувальниками інструкцій, серіалізацією даних тощо.
Перехід по ширині
Техніка широкого розмаху (BFS) використовує чергу для зберігання вузлів графіка. На відміну від техніки DFS, у BFS ми переходимо графік вшир. Це означає, що ми грамотно переходимо рівень графіка. Коли ми досліджуємо всі вершини або вузли на одному рівні, ми переходимо до наступного рівня.
Нижче наведено алгоритм для техніки обходу першої ширини .
Алгоритм
Давайте подивимось алгоритм техніки BFS.
Дано графік G, для якого нам потрібно виконати техніку BFS.
- Крок 1: Почніть з кореневого вузла та вставте його в чергу.
- Крок 2: Повторіть кроки 3 і 4 для всіх вузлів на графіку.
- Крок 3: Видаліть кореневий вузол із черги та додайте його до списку Відвіданих.
- Крок 4: Тепер додайте всі сусідні вузли кореневого вузла до черги і повторіть кроки 2-4 для кожного вузла. (END OF LOOP)
- Крок 6: ВИХІД
Ілюстрація BFS
Проілюструємо техніку BFS на прикладі графіку, показаного нижче. Зверніть увагу, що ми підтримуємо список із назвою „Відвідані” та чергу. Ми використовуємо той самий графік, що і в прикладі DFS для цілей ясності.

По-перше, ми починаємо з кореня, тобто вузла A, і додаємо його до відвіданого списку. Усі сусідні вузли вузла A, тобто B, C та D, додаються до черги.

Далі ми видаляємо вузол B із черги. Ми додаємо його до списку Відвіданих та позначаємо як відвіданий. Далі ми досліджуємо сусідні вузли B в черзі (C вже в черзі). Інший сусідній вузол A вже відвіданий, тому ми його ігноруємо.

Далі ми видаляємо вузол C із черги та позначаємо його як відвіданий. Ми додаємо C до відвіданого списку, а сусідній вузол E додається до черги.

Далі ми видаляємо D з черги та позначаємо його як відвідане. Сусідній вузол A вузла D вже відвіданий, тому ми його ігноруємо.

Отже, у черзі лише вузол E. Ми позначаємо його як відвідане та додаємо до списку відвідуваних. Сусідній вузол E - це C, який вже відвідано. Тож ігноруйте це.

На даний момент черга порожня, і відвіданий список має послідовність, отриману нами в результаті обходу BFS. Послідовність: A-> B-> C-> D-> E.
Впровадження BFS
Наступна програма Java показує реалізацію техніки BFS.
import java.io.*; import java.util.*; //undirected graph represented using adjacency list. class Graph { private int Vertices; // No. of vertices private LinkedList adj_list(); //Adjacency Lists // graph Constructor:number of vertices in graph are passed Graph(int v) { Vertices = v; adj_list = new LinkedList(v); for (int i=0; i Вихід:

Застосування BFS Traversal
# 1) Вивіз сміття: Одним з алгоритмів, що використовується технікою збору сміття для копіювання збору сміття, є «алгоритм Чейні». Цей алгоритм використовує техніку обходу в першу чергу.
# 2) Трансляція в мережах: Трансляція пакетів з однієї точки в іншу в мережі здійснюється за допомогою техніки BFS.
# 3) GPS-навігація: Ми можемо використовувати техніку BFS для пошуку сусідніх вузлів під час навігації за допомогою GPS.
# 4) Веб-сайти соціальних мереж: Техніка BFS також використовується на веб-сайтах соціальних мереж для пошуку мережі людей, що оточують конкретну людину.
# 5) Найкоротший шлях і мінімальне охоплююче дерево на незваженому графіку: На незваженому графіку метод BFS може бути використаний для пошуку мінімального дерева охоплення та найкоротшого шляху між вузлами.
Бібліотека графіків Java
Java не зобов'язує програмістів завжди реалізовувати графіки в програмі. Java надає багато готових бібліотек, які можна безпосередньо використовувати для використання графіків у програмі. Ці бібліотеки мають усі функції API графіків, необхідні для повного використання графіка та його різноманітних функцій.
Нижче наведено короткий вступ до деяких бібліотек графіків на Java.
# 1) Google Гуава: Google Guava пропонує багату бібліотеку, яка підтримує графіки та алгоритми, включаючи прості графіки, мережі, графіки значень тощо.
# 2) Apache Commons: Apache Commons - це проект Apache, який надає компоненти структури даних Graph та API, які мають алгоритми, що працюють з цією структурою даних графіків. Ці компоненти багаторазові.
# 3) JGraphT: JGraphT - одна з широко використовуваних бібліотек графіків Java. Він забезпечує функціональність структури даних графіків, що містить простий графік, спрямований графік, зважений графік тощо, а також алгоритми та API, які працюють над структурою даних графіка.
# 4) SourceForge JUNG: JUNG розшифровується як «Універсальна мережа / графік Java» і є структурою Java. JUNG забезпечує розширювану мову для аналізу, візуалізації та моделювання даних, які ми хочемо представити у вигляді графіку.
JUNG також пропонує різні алгоритми та процедури для декомпозиції, кластеризації, оптимізації тощо.
Часті запитання
Q # 1) Що таке графік у Java?
Відповідь: Графічна структура даних в основному зберігає підключені дані, наприклад, мережа людей або мережа міст. Структура даних графіка зазвичай складається з вузлів або точок, званих вершинами. Кожна вершина з'єднана з іншою вершиною за допомогою посилань, які називаються ребрами.
Q # 2) Які існують типи графіків?
Відповідь: Різні типи графіків наведені нижче.
- Лінійний графік: Лінійний графік використовується для побудови графіків змін у певній властивості щодо часу.
- Гістограма: Стовпчасті графіки порівнюють числові значення таких організацій, як населення в різних містах, відсоток грамотності в країні тощо.
Окрім цих основних типів, ми також маємо інші типи, такі як піктограма, гістограма, графік площі, графік розсіювання тощо.
Q # 3) Що таке зв’язаний графік?
Відповідь: Зв’язаний графік - це графік, у якому кожна вершина пов’язана з іншою вершиною. Отже, у зв’язаному графіку ми можемо дістатися до кожної вершини з будь-якої іншої вершини.
Q # 4) Які програми має графік?
Відповідь: Графіки використовуються в різних додатках. Графік може бути використаний для представлення складної мережі. Графіки також використовуються в програмах соціальних мереж для позначення мережі людей, а також для додатків, таких як пошук сусідніх людей або з'єднань.
Графіки використовуються для позначення потоку обчислень в інформатиці.
Q # 5) Як ви зберігаєте графік?
Відповідь: Є три способи зберігати графік у пам'яті:
# 1) Ми можемо зберігати Вузли або вершини як об'єкти, а ребра як покажчики.
# два) Ми також можемо зберігати графіки як матрицю суміжності, рядки та стовпці якої збігаються з кількістю вершин. Перетин кожного рядка та стовпця позначає наявність або відсутність ребра. У незваженому графіку наявність ребра позначається 1, тоді як у зваженому графіку воно замінюється вагою ребра.
# 3) Останній підхід до зберігання графа полягає у використанні списку суміжностей ребер між вершинами графа або вузлами. Кожен вузол або вершина має свій список суміжності.
Висновок
У цьому підручнику ми детально обговорили графіки на Java. Ми дослідили різні типи графіків, реалізацію графіків та методи обходу. Графіки можна використовувати для пошуку найкоротшого шляху між вузлами.
У наших майбутніх підручниках ми продовжимо вивчати графіки, обговорюючи кілька способів пошуку найкоротшого шляху.
=> Тут слідкуйте за простими навчальними серіями Java.
Рекомендована література
- Підручник з роздумів про Java з прикладами
- Як реалізувати алгоритм Дейкстри в Java
- Підручник з Java SWING: Контейнер, компоненти та обробка подій
- Підручник JAVA для початківців: 100+ практичних відео-підручників Java
- TreeMap в Java - Підручник з прикладами Java TreeMap
- Модифікатори доступу в Java - Підручник із прикладами
- Рядок Java із підручником для буфера рядків та побудови рядків
- Рядок Java містить () Підручник із методів із прикладами