Bredd första sökning

Diagradsövergångar

Diagradsövergång innebär att du besöker varje topp och kant exakt en gång i en brunn -definierad ordning. När du använder vissa grafalgoritmer måste du se till att varje toppunkt i diagrammet besöks exakt en gång. Ordningen i vilken topparna besöks är viktig och kan bero på algoritmen eller frågan som du löser.

Under en genomgång är det viktigt att du spårar vilka hörn som har besökts. Det vanligaste sättet att spåra hörn är att markera dem.

Bredd första sökning (BFS)

Det finns många sätt att korsa diagram. BFS är det vanligaste tillvägagångssättet.

BFS är en korsningsalgoritm där du bör börja korsa från en vald nod (källa eller startnod) och korsa diagrammet lagervis och därmed utforska grannnoderna (noder som är direkt kopplade till källnoden). Du måste sedan gå mot grannraderna på nästa nivå.

Som namnet BFS antyder, måste du gå igenom diagrammet på följande sätt:

  1. Först flyttar du horisontellt och besök alla noder i det aktuella lagret
  2. Gå till nästa lager

Tänk på följande diagram.

Avståndet mellan noderna i lager 1 är jämförelsevis mindre än avståndet mellan noderna i lager 2. Därför måste du i BFS korsa alla noderna i lager 1 innan du flyttar till noderna i lager 2.

Traversing child nodes

En graf kan innehålla cykler, vilket kan ta dig till samma nod igen när du går igenom diagrammet. För att undvika bearbetning av samma nod igen, använd en boolesk matris som markerar noden efter att den har bearbetats. När du besöker noder i lagret i en graf, lagra dem på ett sådant sätt att du kan korsa motsvarande underordnade noder i samma ordning.

För att göra den här processen enkel, använd en kö för att lagra noden och markera den som ”besökt” tills alla dess grannar (hörn som är direkt anslutna till den) är markerade. Kön följer kömetoden First In First Out (FIFO), och därför kommer nodens hamnar att besöks i den ordning som de infördes i noden, dvs. den nod som infördes först kommer att besökas först, och så på.

Pseudokod

Korsningsprocess

Korsningen startar från källnoden och trycker på s i kö. s kommer att markeras som ”besökt”.

Första iteration

  • kommer att poppas från kön
  • Grannar till s dvs 1 och 2 kommer att passeras
  • 1 och 2, som inte har korsats tidigare, korsas. De kommer att vara:
    • Trycks i kön
    • 1 och 2 markeras som besökta

Andra iteration

  • 1 poppar från kön
  • Grannar på 1 ie s och 3 passeras
  • s ignoreras eftersom den är markerad som ”besökt”
  • 3, som inte har passerats tidigare, passeras. Det är:
    • Tryckt i kön
    • Markerat som besökt

Tredje iteration

  • 2 poppar från kön
  • Grannar på 2 dvs s, 3 och 4 passeras
  • 3 och s ignoreras eftersom de är markerade som ”besökta”
  • 4, som inte har passerats tidigare, passeras. Det är:
    • Tryckt i kön
    • Markerat som besökt

Fjärde iteration

  • 3 poppar från kön
  • Grannar på 3 dvs. 1, 2 och 5 passeras
  • 1 och 2 ignoreras eftersom de är markerade som ”besökta”
  • 5, som inte har passerats tidigare, passeras. Det är:
    • Tryckt i kön
    • Markerat som besökt

Femte iteration

  • 4 kommer att poppas från kön
  • Grannar av 4 dvs. 2 passeras
  • 2 ignoreras eftersom den redan är markerad som ”besökt”

Sjätte iteration

  • 5 poppar från kön
  • Grannar på 5 dvs. 3 passeras
  • 3 ignoreras eftersom den är redan markerad som ”besökt”

Kön är tom och den kommer ut ur slingan. Alla noder har korsats genom att använda BFS.

Om alla kanterna i en graf har samma vikt kan BFS också användas för att hitta det minsta avståndet mellan noderna i en graf.

Exempel

Som i detta diagram, börja från källnoden för att hitta avståndet mellan källan nod och nod 1. Om du inte följer BFS-algoritmen kan du gå från källnoden till nod 2 och sedan till nod 1. Denna metod beräknar avståndet mellan källnoden och nod 1 som 2, medan avståndet är faktiskt 1. Minsta avstånd kan beräknas korrekt med hjälp av BFS-algoritmen.

Komplexitet

Tidskomplexiteten för BFS är O (V + E), där V är antalet noder och E är antalet kanter.

Applikationer

1. Hur bestämmer du nivån för varje nod i det angivna trädet?

Som du vet i BFS, korsar du nivåvis. Du kan också använda BFS för att bestämma nivån för varje nod.

Implementering

Den här koden liknar BFS-koden med endast följande skillnad:
nivå] = nivå + 1;

I den här koden, när du besöker varje nod, ställs nivån för den noden in med ett steg i nivån för dess överordnade nod. Så här bestäms nivån för varje nod.

2 . 0-1 BFS

Denna typ av BFS används för att hitta det kortaste avståndet mellan två noder i en graf förutsatt att kanterna i diagrammet har vikterna 0 eller 1. Om du använder BFS som förklarades tidigare i den här artikeln får du ett felaktigt resultat för det optimala avståndet mellan två noder.

I detta tillvägagångssätt används inte en boolesk matris för att markera noden eftersom tillståndet för det optimala avståndet kommer att kontrolleras när du besök varje nod. En dubbelsidig kö används för att lagra noden. I 0-1 BFS, om vikten på kanten = 0, trycks noden fram till avkanten. Om vikten på kanten = 1, skjuts noden till baksidan av dequeue.

Implementering

Q är en dubbelkö. Avståndet är en matris där avståndet innehåller avståndet från startnoden till v-noden. Ursprungligen är avståndet definierat från källnoden till varje nod oändligt.

Låt oss förstå den här koden med följande graf:

Närliggande lista i diagrammet kommer att vara som följer:
Här anses ”s” vara 0 eller källnod.

0 – > 1 – > 3 – > 2
kanter.first = 1, kanter.sekund = 1
kanter.first = 3, kanter.sekund = 0
kanter.först = 2, kanter.sekund = 1

1 – > 0 – > 4
kanter.first = 0, kanter.sekund = 1
kanter.first = 4 , sides.second = 0

2 – > 0 – > 3
edge.first = 0 , sides.second = 0
edge.first = 3, sides.second = 0

3 – > 0 – > 2 – > 4
kanter.first = 0, kanter.sekund = 0
kanter.first = 2, kanter.sekund = 0
kanter.first = 4, kanter.sekunder = 0

4 – > 1 – > 3
kanter.first = 1, kanter.sekunder = 0
kanter.first = 3, kanter.sekunder = 0

Om du använder BFS-algoritmen blir resultatet felaktigt eftersom det visar dig det optimala avståndet mellan s och nod 1 och s och nod 2 som 1 respektive. Detta beror på att den besöker barnen till s och beräknar avståndet mellan s och dess barn, vilket är 1. Det faktiska optimala avståndet är 0 i båda fallen.

Bearbetning

Från och med källnoden, dvs. 0, kommer den att röra sig mot 1, 2 och 3. Eftersom kantvikten mellan 0 och 1 och 0 och 2 är 1 respektive , 1 och 2 kommer att skjutas till baksidan av kön. Eftersom kantvikten mellan 0 och 3 är 0 kommer dock 3 att skjutas fram till kön. Avståndet kommer att bibehållas i avståndsarrangemanget i enlighet därmed.

3 kommer sedan att poppas från kön och samma process kommer att tillämpas på dess grannar och så vidare.

Bidrag av: Prateek Garg

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *