graph implementation c using adjacency list
Denne vejledning forklarer implementeringen af grafer i C ++. Du lærer også om forskellige typer, repræsentationer og anvendelser af grafer:
En graf er en ikke-lineær datastruktur. En graf kan defineres som en samling af noder, der også kaldes 'hjørner' og 'kanter', der forbinder to eller flere hjørner.
En graf kan også ses som et cyklisk træ, hvor hjørner ikke har et forældre-barn-forhold, men opretholder et komplekst forhold mellem dem.
qa interview spørgsmål og svar pdf
=> Klik her for den absolutte C ++ træningsserie.
Hvad du lærer:
Hvad er en graf i C ++?
Som anført ovenfor er en graf i C ++ en ikke-lineær datastruktur defineret som en samling af hjørner og kanter.
Følgende er et eksempel på en grafdatastruktur.
Ovenstående er et eksempel på graf G. Graf G er et sæt hjørner {A, B, C, D, E} og et sæt kanter {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Typer af grafer - Dirigeret og ikke-dirigeret graf
En graf, hvor kanterne ikke har retninger, kaldes den ikke-dirigerede graf. Grafen vist ovenfor er en ikke-rettet graf.
En graf, hvor kanterne har retninger tilknyttet, kaldes en Directed graph.
Nedenfor er et eksempel på en rettet graf.
I den rettede graf vist ovenfor danner kanter et ordnet par, hvor hver kant repræsenterer en bestemt sti fra et toppunkt til et andet toppunkt. Toppunktet, hvorfra stien starter, kaldes “ Indledende knude ”Mens toppunktet, hvor stien ender, kaldes“ Terminalknude ”.
I ovenstående graf er sættet med hjørner {A, B, C, D, E} og kantsættet er {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Vi vil diskutere grafterminologien eller de almindelige udtryk, der bruges i forhold til grafen nedenfor.
Grafterminologi
- Hvirvel: Hver knude i grafen kaldes et toppunkt. I ovenstående graf er A, B, C og D hjørnerne i grafen.
- Kant: Forbindelsen eller stien mellem to hjørner kaldes en kant. Den forbinder to eller flere hjørner. De forskellige kanter i ovenstående graf er AB, BC, AD og DC.
- Tilstødende knude: I en graf, hvis to noder er forbundet med en kant, kaldes de tilstødende noder eller naboer. I ovenstående graf er hjørnerne A og B forbundet med kant AB. A og B er således tilstødende noder.
- Grad af knudepunktet: Antallet af kanter, der er forbundet til en bestemt knude kaldes graden af knudepunktet. I ovenstående graf har knudepunkt A en grad 2.
- Sti: Sekvensen af noder, som vi skal følge, når vi skal rejse fra et toppunkt til et andet i en graf kaldes stien. I vores eksempelgraf, hvis vi har brug for at gå fra node A til C, ville stien være A-> B-> C.
- Lukket sti: Hvis den oprindelige node er den samme som en terminal node, betegnes den sti som den lukkede sti.
- Enkel sti: En lukket sti, hvor alle de andre noder er forskellige, kaldes en simpel sti.
- Cyklus: En sti, hvor der ikke er gentagne kanter eller hjørner, og de første og sidste hjørner er de samme kaldes en cyklus. I ovenstående graf er A-> B-> C-> D-> A en cyklus.
- Forbundet graf: En tilsluttet graf er den, hvor der er en sti mellem hver af hjørnerne. Dette betyder, at der ikke er et enkelt toppunkt, der er isoleret eller uden en forbindelseskant. Grafen vist ovenfor er en tilsluttet graf.
- Komplet graf: En graf, hvor hver knude er forbundet til en anden, kaldes den komplette graf. Hvis N er det samlede antal noder i en graf, indeholder den komplette graf N (N-1) / 2 antal kanter.
- Vægtet graf: En positiv værdi tildelt hver kant, der angiver dens længde (afstanden mellem hjørnerne forbundet med en kant) kaldes vægt. Grafen, der indeholder vægtede kanter, kaldes en vægtet graf. Vægten af en kant e er betegnet med w (e), og det angiver omkostningerne ved at krydse en kant.
- Afsnit: En digraf er en graf, hvor hver kant er forbundet med en bestemt retning, og traversal kun kan udføres i specificeret retning.
Grafrepræsentation
Den måde, hvorpå grafdatastruktur lagres i hukommelsen kaldes 'repræsentation'. Grafen kan gemmes som en sekventiel repræsentation eller som en sammenkædet repræsentation.
Begge disse typer er beskrevet nedenfor.
Sekventiel repræsentation
I den sekventielle gengivelse af grafer bruger vi adjacency matrix. En adjacency matrix er en matrix af størrelse n x n hvor n er antallet af hjørner i grafen.
Rækkerne og kolonnerne i tilknytningsmatrixen repræsenterer hjørnerne i en graf. Matrixelementet er indstillet til 1, når der er en kant til stede mellem hjørnerne. Hvis kanten ikke er til stede, er elementet indstillet til 0.
Nedenfor er et eksempel på en graf, der viser dens nærhedsmatrix.
Vi har set nærhedsmatrixen for ovenstående graf. Bemærk, at da dette er en ikke-rettet graf, kan vi sige, at kanten er til stede i begge retninger. For eksempel, da kant AB er til stede, kan vi konkludere, at kant BA også er til stede.
I tilknytningsmatrixen kan vi se interaktionerne mellem hjørnerne, som er matrixelementer, der er indstillet til 1, når kanten er til stede, og til 0, når kanten ikke er til stede.
Lad os nu se tilknytningsmatrixen for en rettet graf.
Som vist ovenfor vil skæringselementet i adjacencymatrixen være 1, hvis og kun hvis der er en kant rettet fra et toppunkt til et andet.
I ovenstående graf har vi to kanter fra hjørne A. Den ene ende slutter til hjørne B, mens den anden slutter i hjørne C. Således i skæringsmatrix er skæringspunktet mellem A og B sat til 1 som skæringspunktet mellem A og C.
Dernæst vil vi se den sekventielle repræsentation for den vægtede graf.
Nedenfor er den vægtede graf og dens tilsvarende nærhedsmatrix.
Vi kan se, at den sekventielle repræsentation af en vægtet graf er forskellig fra de andre typer af grafer. Her erstattes værdierne, der ikke er nul i nærhedsmatricen med kantens faktiske vægt.
Kanten AB har vægt = 4, så i adjacency matrixen indstiller vi skæringspunktet mellem A og B til 4. Tilsvarende ændres alle de andre værdier, der ikke er nul, til deres respektive vægte.
Nærhedslisten er lettere at implementere og følge. Traversal, dvs. at kontrollere, om der er en kant fra et toppunkt til et andet, tager O (1) tid og fjernelse af en kant tager også O (1).
Uanset om grafen er sparsom (færre kanter) eller tæt, tager det altid mere plads.
Tilknyttet repræsentation
Vi bruger nærhedslisten til den sammenkædede repræsentation af grafen. Repræsentationen for nærhedslisten opretholder hver node i grafen og et link til de noder, der støder op til denne node. Når vi krydser alle de tilstødende noder, sætter vi den næste markør til null i slutningen af listen.
Lad os først overveje en ikke-rettet graf og dens nærhedsliste.
Som vist ovenfor har vi en sammenkædet liste (nærhedsliste) for hver knude. Fra toppunkt A har vi kanter til hjørnerne B, C og D. Disse knudepunkter er således knyttet til knude A i den tilsvarende nærhedsliste.
Dernæst konstruerer vi en nærhedsliste til den dirigerede graf.
I den ovennævnte retning ser vi, at der ikke er nogen kanter, der stammer fra toppunkt E. Derfor er nærhedslisten for toppunkt E tom.
bedste webhostingtjenester i Indien
Lad os nu konstruere nærhedslisten til den vægtede graf.
For en vægtet graf tilføjer vi et ekstra felt i knudepunktet til nærhedslisten for at angive kantens vægt som vist ovenfor.
Det er lettere at tilføje toppunkt i nærhedslisten. Det sparer også plads på grund af den tilknyttede listeimplementering. Når vi skal finde ud af, om der er en kant mellem et toppunkt til et andet, er operationen ikke effektiv.
Grundlæggende funktioner til grafer
Følgende er de grundlæggende operationer, som vi kan udføre på grafdatastrukturen:
- Tilføj et toppunkt: Tilføjer toppunkt til grafen.
- Tilføj en kant: Tilføjer en kant mellem de to hjørner i en graf.
- Vis grafhjørnerne: Vis hjørnerne i en graf.
C ++ - grafimplementering ved hjælp af Adjacency List
Nu præsenterer vi en C ++ implementering for at demonstrere en simpel graf ved hjælp af adjacency listen.
Her skal vi vise nærhedslisten for en vægtet rettet graf. Vi har brugt to strukturer til at holde nærhedslisten og kanterne på grafen. Tilstødelseslisten vises som (start_vertex, end_vertex, vægt).
C ++ - programmet er som følger:
#include using namespace std; // stores adjacency list items struct adjNode { int val, cost; adjNode* next; }; // structure to store edges struct graphEdge { int start_ver, end_ver, weight; }; class DiaGraph{ // insert new nodes into adjacency list from given graph adjNode* getAdjListNode(int value, int weight, adjNode* head) { adjNode* newNode = new adjNode; newNode->val = value; newNode->cost = weight; newNode->next = head; // point new node to current head return newNode; } int N; // number of nodes in the graph public: adjNode **head; //adjacency list as array of pointers // Constructor DiaGraph(graphEdge edges[], int n, int N) { // allocate new node head = new adjNode*[N](); this->N = N; // initialize head pointer for all vertices for (int i = 0; i Produktion:
Produktion:
Liste over tilstødelsesdiagrammer
(start_vertex, end_vertex, vægt):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)
Anvendelser af grafer
Lad os diskutere nogle af anvendelserne af grafer.
- Grafer bruges i vid udstrækning inden for datalogi til at skildre netværksgrafer eller semantiske grafer eller endda til at skildre strømmen af beregning.
- Grafer bruges i vid udstrækning i kompilatorer til at skildre allokering af ressourcer til processer eller til at indikere datastrømsanalyse osv.
- Grafer bruges også til optimering af forespørgsler på databasesprog i nogle specialiserede kompilatorer.
- På sociale netværkssider er grafer de vigtigste strukturer til at skildre netværk af mennesker.
- Grafer bruges i vid udstrækning til at opbygge transportsystemet, især vejnetværket. Et populært eksempel er Google maps, der i vid udstrækning bruger grafer til at indikere retninger over hele verden.
Konklusion
En graf er en populær og udbredt anvendt datastruktur, som har mange applikationer inden for det datalogiske felt bortset fra andre områder. Grafer består af hjørner og kanter, der forbinder to eller flere hjørner.
En graf kan dirigeres eller ikke rettes. Vi kan repræsentere grafer ved hjælp af nærhedsmatrix, som er en lineær repræsentation såvel som ved hjælp af tilknytningsliste. Vi diskuterede også implementeringen af grafen i denne vejledning.
=> Se her for at udforske den komplette C ++ tutorials-liste.
Anbefalet læsning
- Python Advanced List Tutorial (List Sort, Reverse, Index, Copy, Join, Sum)
- Python-liste - Opret, adgang, udskær, tilføj eller slet elementer
- Standard router IP-adresseliste til almindelige trådløse routermærker
- 12 bedste værktøjer til fremstilling af linjegraf til oprettelse af fantastiske linjegrafer [2021 RANGER]
- Standardadgangskode til router-login til de bedste routermodeller (2021-liste)
- Sammenkædet liste datastruktur i C ++ med illustration
- Cirkulær sammenkædet liste Datastruktur i C ++ med illustration
- Dobbelt sammenkædet liste Datastruktur i C ++ med illustration