java graph tutorial how implement graph data structure
Ovaj sveobuhvatni vodič za Java grafikone detaljno objašnjava strukturu podataka grafikona. Uključuje kako stvoriti, implementirati, predstaviti i preći grafikone u Javi:
Grafička struktura podataka uglavnom predstavlja mrežu koja povezuje različite točke. Te se točke nazivaju vrhovima, a poveznice koje povezuju ove vrhove nazivaju se 'rubovi'. Dakle, graf g definiran je kao skup vrhova V i bridova E koji povezuju ove vrhove.
Grafovi se uglavnom koriste za predstavljanje različitih mreža poput računalnih mreža, društvenih mreža itd. Također se mogu koristiti za predstavljanje različitih ovisnosti u softveru ili arhitekturi. Ovi grafikoni ovisnosti vrlo su korisni u analizi softvera, a ponekad i u otklanjanju pogrešaka.
=> Ovdje provjerite SVE Java tutorijale.
Što ćete naučiti:
- Struktura podataka Java Graph
- Kako stvoriti grafikon?
- Implementacija grafa u Javi
- Biblioteka Java Graph
- Zaključak
Struktura podataka Java Graph
Dolje je dat graf koji ima pet vrhova {A, B, C, D, E} i rubove zadane od {{AB}, {AC}, {AD}, {BD}, {CE}, {ED}}. Budući da rubovi ne pokazuju nikakve smjerove, ovaj je graf poznat kao 'neusmjereni graf'.
Osim gore prikazanog neusmjerenog grafa, u Javi postoji nekoliko varijanti grafa.
Razgovarajmo detaljno o ovim varijantama.
Različite inačice grafikona
Slijede neke od inačica grafikona.
# 1) Usmjereni grafikon
Usmjereni graf ili digraf je struktura podataka grafa u kojoj rubovi imaju određeni smjer. Oni potječu iz jednog vrha, a kulminiraju u drugi vrh.
Sljedeći dijagram prikazuje primjer usmjerenog grafa.
U gornjem dijagramu postoji rub od vrha A do vrha B. Ali imajte na umu da A do B nije isto što i B do A kao u neusmjerenom grafu, osim ako nema ruba navedenog od B do A.
Usmjereni graf je cikličan ako postoji barem jedan put koji ima svoj prvi i posljednji vrh isti. U gornjem dijagramu put A-> B-> C-> D-> E-> A tvori usmjereni ciklus ili ciklički graf.
relacijske i nerelacijske baze podataka za i protiv
Suprotno tome, usmjereni aciklički graf je graf u kojem ne postoji usmjereni ciklus tj. Ne postoji put koji tvori ciklus.
# 2) Ponderirani grafikon
U ponderiranom grafu težinaje povezan sa svakim rubom grafikona. Uteg obično označava udaljenost između dva vrha. Sljedeći dijagram prikazuje ponderirani graf. Kako nisu prikazane upute, ovo je neusmjereni graf.
Imajte na umu da ponderirani graf može biti usmjeren ili usmjeren.
Kako stvoriti grafikon?
Java ne pruža punopravnu implementaciju strukture podataka grafikona. Međutim, grafikon možemo programski predstaviti pomoću zbirki u Javi. Također možemo implementirati graf koristeći dinamičke nizove poput vektora.
Grafove obično implementiramo u Javi pomoću HashMap kolekcije. HashMap elementi su u obliku parova ključ / vrijednost. Popis susjednosti grafa možemo predstaviti u HashMap-u.
Najčešći način izrade grafa je upotreba jednog od prikaza grafova poput matrice susjedstva ili popisa susjedstva. Sljedeće ćemo raspravljati o tim prikazima, a zatim ćemo grafiku implementirati u Javu pomoću popisa susjednosti za koji ćemo koristiti ArrayList.
Prikaz grafikona u Javi
Prikazivanje grafa znači pristup ili tehniku pomoću kojih se podaci grafa pohranjuju u memoriju računala.
Imamo dva glavna prikaza grafikona kao što je prikazano u nastavku.
Matrica susjedstva
Matrica susjedstva linearni je prikaz grafova. Ova matrica pohranjuje mapiranje vrhova i bridova grafa. U matrici susjedstva vrhovi grafikona predstavljaju retke i stupce. To znači da ako graf ima N vrhova, tada će matrica susjedstva imati veličinu NxN.
Ako je V skup vrhova grafa, tada je presjek Mi Jna popisu susjednosti = 1 znači da postoji rub između vrhova i i j.
Da bismo bolje razumjeli ovaj koncept, pripremimo matricu susjedstva za neusmjereni graf.
Kao što se vidi iz gornjeg dijagrama, vidimo da su za vrh A sjecišta AB i AE postavljena na 1 jer postoji rub od A do B i A do E. Slično je i sjecište BA postavljeno na 1, jer je ovo neusmjereno graf i AB = BA. Slično tome, postavili smo sva ostala sjecišta za koja postoji rub na 1.
U slučaju da je graf usmjeren, sjecište Mi Jpostavit će se na 1 samo ako postoji čist rub usmjeren od Vi do Vj.
To je prikazano na sljedećoj ilustraciji.
Kao što možemo vidjeti iz gornjeg dijagrama, postoji rub od A do B. Dakle, presjek AB je postavljen na 1, ali je presjek BA postavljen na 0. To je zato što ne postoji rub usmjeren od B do A.
Razmotrimo vrhove E i D. Vidimo da postoje bridovi od E do D, kao i D do E. Stoga smo oba ta sjecišta postavili na 1 u susjednoj Matrici.
Sada prelazimo na ponderirane grafikone. Kao što znamo za ponderirani graf, uz svaki je rub povezan cijeli broj poznat i kao težina. Ovu težinu predstavljamo u matrici susjedstva za rub koji postoji. Ova se težina navodi kad god postoji rub iz jednog vrha u drugi umjesto '1'.
Ovaj prikaz je prikazan u nastavku.
Popis susjedstva
Umjesto da grafikon prikažemo kao matricu susjedstva koja je sekvencijalne prirode, također možemo koristiti povezani prikaz. Ovaj povezani prikaz poznat je kao popis susjedstva. Popis susjednosti nije ništa drugo nego povezani popis i svaki čvor na popisu predstavlja vrh.
Prisutnost ruba između dva vrha označava se pokazivačem od prvog vrha do drugog. Ovaj popis susjedstva održava se za svaki vrh na grafikonu.
Kad smo prešli sve susjedne čvorove za određeni čvor, pohranjujemo NULL u sljedeće polje pokazivača zadnjeg čvora popisa susjedstva.
Sada ćemo upotrijebiti gornje grafikone koje smo koristili za predstavljanje matrice susjedstva za demonstraciju popisa susjednosti.
Gornja slika prikazuje popis susjedstva za neusmjereni graf. Vidimo da svaki vrh ili čvor ima svoj popis susjednosti.
U slučaju neusmjerenog grafa, ukupne duljine popisa susjedstva obično su dvostruko veći od broja rubova. Na gornjem je grafikonu ukupan broj bridova 6, a ukupan ili zbroj duljine cijelog popisa susjednosti 12.
Sada pripremimo popis susjedstva za usmjereni graf.
Kao što se vidi sa gornje slike, u usmjerenom grafu ukupna duljina popisa susjednosti grafa jednaka je broju bridova na grafu. U gornjem grafikonu nalazi se 9 bridova i zbroj duljina popisa susjednosti za ovaj graf = 9.
Razmotrimo sada sljedeći ponderirani usmjereni graf. Imajte na umu da svaki rub ponderiranog grafa ima težinu povezanu s njim. Dakle, kada predstavljamo ovaj graf popisom susjednosti, u svaki čvor popisa moramo dodati novo polje koje će označavati težinu ruba.
Popis susjednosti za ponderirani graf prikazan je u nastavku.
Gornji dijagram prikazuje ponderirani graf i njegov popis susjednosti. Imajte na umu da na popisu susjedstva postoji novi prostor koji označava težinu svakog čvora.
Implementacija grafa u Javi
Sljedeći program prikazuje implementaciju grafa u Javi. Ovdje smo koristili popis susjedstva za predstavljanje grafa.
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 Izlaz:
Grafički prikaz Java
Da bismo izveli bilo koju značajnu radnju poput traženja prisutnosti bilo kakvih podataka, trebamo preći graf tako da se svaki vrh i rub grafa posjete barem jednom. To se radi pomoću algoritama grafova koji nisu ništa drugo do skup uputa koje nam pomažu u prelasku grafa.
Podržana su dva algoritma za prelazak grafa u Javi .
- Dubinsko prvo prijelaz
- Prijelaz prva širina
Dubina prvo prelazak
Dubinsko pretraživanje (DFS) je tehnika koja se koristi za prelazak stabla ili grafa. DFS tehnika započinje s korijenskim čvorom, a zatim prelazi susjedne čvorove korijenskog čvora zalazeći dublje u graf. U DFS tehnici, čvorovi se prelaze dubinski dok više nema djece za istraživanje.
Jednom kad dođemo do čvora lista (nema više podređenih čvorova), DFS se vraća i započinje s drugim čvorovima i vrši zaokret na sličan način. DFS tehnika koristi strukturu podataka steka za pohranu čvorova koji se prelaze.
Slijedi algoritam za DFS tehniku.
Algoritam
Korak 1: Započnite s korijenskim čvorom i umetnite ga u stog
Korak 2: stavku stavite u stog i umetnite na popis 'posjetili'
Korak 3: Za čvor označen kao „posjećen“ (ili na popisu posjećenih) dodajte susjedne čvorove ovog čvora koji još nisu označeni kao posjećeni.
Korak 4: Ponavljajte korake 2 i 3 dok se stog ne isprazni.
Ilustracija DFS tehnike
Sada ćemo ilustrirati DFS tehniku pomoću odgovarajućeg primjera grafa.
Dolje je dat primjer grafa. Održavamo stog za pohranu istraženih čvorova i popis za pohranu posjećenih čvorova.
Za početak ćemo započeti s A, označiti ga kao posjećen i dodati na popis posjećenih. Tada ćemo razmotriti sve susjedne čvorove A i te čvorove gurnuti na stog kao što je prikazano dolje.
Dalje, izvadimo čvor iz stoga tj. B i označimo ga kao posjećen. Zatim ga dodajemo na popis 'posjetili'. Ovo je predstavljeno u nastavku.
Sada razmatramo susjedne čvorove B koji su A i C. Iz toga je A već posjećen. Pa ga ignoriramo. Dalje, iskočimo C iz hrpe. Oznaka C kao posjećena. Susjedni čvor C tj. E dodaje se u stog.
kako otvoriti .jar datoteke
Dalje, izvadimo sljedeći čvor E iz snopa i označimo ga kao posjećen. Susjedni čvor E čvora je C koji je već posjećen. Pa ga ignoriramo.
Sada u stogu ostaje samo čvor D. Stoga ga označavamo kao posjećen. Njegov susjedni čvor je A koji je već posjećen. Stoga ga ne dodajemo u stog.
U ovom trenutku stog je prazan. To znači da smo dovršili zaokret s dubinom za zadani graf.
Posjećeni popis daje konačni slijed prijelaza tehnikom dubine prve. Konačni DFS slijed za gornji graf je A-> B-> C-> E-> D.
Implementacija DFS-a
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 Izlaz:
Primjene DFS-a
# 1) Otkrivanje ciklusa u grafikonu: DFS olakšava otkrivanje ciklusa u grafikonu kada se možemo vratiti na rub.
# 2) Pronalaženje puta: Kao što smo već vidjeli na ilustraciji DFS, s obzirom na bilo koja dva vrha možemo pronaći put između ta dva vrha.
# 3) Minimum rasponsko stablo i najkraći put: Ako DFS tehniku pokrenemo na neponderiranom grafu, to će nam dati minimalno stablo raspona i kratki put.
# 4) Topološko sortiranje: Topološko se sortiranje koristi kada moramo rasporediti poslove. Imamo ovisnosti među raznim poslovima. Topološko sortiranje također možemo koristiti za rješavanje ovisnosti među veznicima, planerom uputa, serializacijom podataka itd.
Prijelaz prva širina
Tehnika prvo širine (BFS) koristi red za spremanje čvorova grafikona. Za razliku od DFS tehnike, u BFS-u grafikon prelazimo u širini. To znači da pametno prelazimo razinu grafikona. Kada istražimo sve vrhove ili čvorove na jednoj razini, prelazimo na sljedeću razinu.
Dolje je dan algoritam za tehniku prijelaza u širinu .
Algoritam
Pogledajmo algoritam za BFS tehniku.
Dat je graf G za koji trebamo izvesti BFS tehniku.
- Korak 1: Započnite s korijenskim čvorom i umetnite ga u red čekanja.
- Korak 2: Ponovite korake 3 i 4 za sve čvorove na grafikonu.
- Korak 3: Uklonite korijenski čvor iz reda i dodajte ga na popis Posjećeno.
- Korak 4: Sada dodajte sve susjedne čvorove korijenskog čvora u red i ponovite korake 2 do 4 za svaki čvor. [END OF LOOP]
- Korak 6: IZLAZ
Ilustracija BFS-a
Ilustrirajmo BFS tehniku pomoću primjera prikazanog dolje. Imajte na umu da smo održali popis s nazivom 'Posjećeno' i red. Koristimo isti grafikon koji smo koristili u primjeru DFS radi jasnosti.
Prvo započinjemo s root-om tj. Čvorom A i dodajemo ga na posjećeni popis. Svi susjedni čvorovi čvora A, tj. B, C i D, dodaju se u red.
Dalje uklanjamo čvor B iz reda. Dodamo ga na popis Posjećeno i označavamo kao posjećen. Dalje istražujemo susjedne čvorove B u redu (C je već u redu). Već je posjećen drugi susjedni čvor A, pa ga zanemarujemo.
Zatim uklonimo čvor C iz reda i označimo ga kao posjećen. Na posjećeni popis dodajemo C, a susjedni čvor E dodaje se u red čekanja.
Zatim brišemo D iz reda i označavamo ga kao posjećen. Susjedni čvor A čvora D već je posjećen, pa ga zanemarujemo.
Dakle, sada je samo čvor E u redu čekanja. Označavamo ga kao posjećeno i dodajemo na popis posjećenih. Susjedni čvor E je C koji je već posjećen. Pa zanemari to.
U ovom trenutku red je prazan, a posjećeni popis ima slijed koji smo dobili kao rezultat BFS prelaska. Slijed je A-> B-> C-> D-> E.
Implementacija BFS-a
Sljedeći Java program prikazuje provedbu BFS tehnike.
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 Izlaz:
Primjene BFS prelaska
# 1) Skupljanje smeća: Jedan od algoritama koji koristi tehnika odvoza smeća za kopiranje odvoza smeća je 'Cheneyev algoritam'. Ovaj algoritam koristi tehniku prijelaza u širinu.
# 2) Emitiranje u mrežama: Emitiranje paketa s jedne točke na drugu u mreži vrši se pomoću BFS tehnike.
# 3) GPS navigacija: BFS tehnikom možemo koristiti za pronalaženje susjednih čvorova tijekom navigacije pomoću GPS-a.
# 4) Web stranice za društvene mreže: BFS tehnika također se koristi na web stranicama društvenih mreža za pronalaženje mreže ljudi koji okružuju određenu osobu.
# 5) Najkraća staza i minimalno rasponično stablo u neuvažanom grafu: U neponderiranom grafu, BFS tehnika može se koristiti za pronalaženje stabla minimalnog raspona i najkraćeg puta između čvorova.
Biblioteka Java Graph
Java ne zahtijeva da programeri uvijek implementiraju grafikone u program. Java nudi puno spremnih knjižnica koje se mogu izravno koristiti za korištenje grafikona u programu. Te knjižnice imaju sve API funkcije grafa potrebne za potpuno korištenje grafa i njegovih različitih značajki.
Slijedi kratak uvod u neke od knjižnica grafova na Javi.
# 1) Google Guava: Google Guava nudi bogatu biblioteku koja podržava grafikone i algoritme, uključujući jednostavne grafikone, mreže, grafikone vrijednosti itd.
# 2) Apache Commons: Apache Commons je Apache projekt koji nudi komponente strukture podataka grafikona i API-je koji imaju algoritme koji djeluju na ovoj strukturi podataka grafikona. Te se komponente mogu ponovno koristiti.
# 3) JGraphT: JGraphT je jedna od široko korištenih Java knjižnica grafova. Pruža funkcionalnost strukture podataka grafa koja sadrži jednostavni graf, usmjereni graf, ponderirani graf itd., Kao i algoritme i API-je koji rade na strukturi podataka grafa.
# 4) SourceForge JUNG: JUNG je skraćenica od 'Java Universal Network / Graph' i predstavlja Java okvir. JUNG pruža proširivi jezik za analizu, vizualizaciju i modeliranje podataka za koje želimo da budu predstavljeni u obliku grafikona.
JUNG također nudi razne algoritme i rutine za razgradnju, klasterizaciju, optimizaciju itd.
Često postavljana pitanja
P # 1) Što je graf u Javi?
Odgovor: Graf podataka struktura uglavnom pohranjuje povezane podatke, na primjer, mreža ljudi ili mreža gradova. Struktura podataka grafa obično se sastoji od čvorova ili točaka koje se nazivaju vrhovi. Svaki je vrh povezan s drugim vrhom pomoću veza koje se nazivaju rubovi.
P # 2) Koje su vrste grafova?
Odgovor: U nastavku su navedene različite vrste grafova.
- Linijski grafikon: Linijski grafikon koristi se za crtanje promjena u određenom svojstvu u odnosu na vrijeme.
- Trakasti grafikon: Trakasti grafikoni uspoređuju numeričke vrijednosti entiteta poput stanovništva u raznim gradovima, postotka pismenosti u cijeloj zemlji itd.
Osim ovih glavnih tipova imamo i druge vrste kao što su piktograf, histogram, graf područja, dijagram raspršenja itd.
P # 3) Što je povezani graf?
Odgovor: Povezani graf je graf u kojem je svaki vrh povezan s drugim vrhom. Stoga u povezanom grafu možemo doći do svakog vrha iz svakog drugog vrha.
P # 4) Koje su primjene grafa?
Odgovor: Grafovi se koriste u raznim aplikacijama. Graf se može koristiti za predstavljanje složene mreže. Grafovi se također koriste u aplikacijama za društvene mreže za označavanje mreže ljudi, kao i za aplikacije poput pronalaska susjednih ljudi ili veza.
Grafikoni se koriste za označavanje tijeka računanja u računalnim znanostima.
5. pitanje) Kako pohranjujete graf?
Odgovor: Postoje tri načina za pohranu grafa u memoriju:
# 1) Čvorove ili vrhove možemo pohraniti kao predmete, a rubove kao pokazivače.
#dva) Grafove također možemo pohraniti kao matricu susjedstva čiji su retci i stupci jednaki broju vrhova. Sjecište svakog retka i stupca označava prisutnost ili odsutnost ruba. U netehtanom grafu prisutnost ruba označava se s 1, dok se u vaganom grafu zamjenjuje težinom ruba.
# 3) Posljednji pristup spremanju grafa je upotreba popisa susjednih rubova između vrhova ili čvorova grafa. Svaki čvor ili vrh ima svoj popis susjedstva.
Zaključak
U ovom uputstvu detaljno smo raspravljali o grafikonima na Javi. Istražili smo razne vrste grafova, implementaciju grafa i tehnike prelaska. Grafovi se mogu koristiti za pronalaženje najkraćeg puta između čvorova.
U našim predstojećim vodičima nastavit ćemo istraživati grafikone raspravljajući o nekoliko načina pronalaska najkraćeg puta.
=> Ovdje pripazite na jednostavnu seriju Java treninga.
Preporučena literatura
- Java Vodič za refleksiju s primjerima
- Kako implementirati Dijkstrin algoritam u Javi
- Java SWING Vodič: Spremnici, komponente i upravljanje događajima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- TreeMap u Javi - Vodič uz primjere Java TreeMap
- Pristupiti modifikatorima u Javi - Vodič s primjerima
- Java string sa String Buffer-om i String Builder Tutorial
- Java String sadrži () Vodič za metode s primjerima