Her er målet å dra nytte av det faktum at en Min-Root Heap alltid returnerer det minste medlemmet. Den første oppføringen til hver koblede liste er det minste elementet i den tilsvarende listen, siden alle de koblede listene allerede er sortert i denne teknikken. Vi drar nytte av denne omstendigheten ved å opprette en min-heap av det første medlemmet av hver koblede liste. Det minste elementet oppnås deretter ved å trekke ut det øverste elementet (roten) til Min-Heap. Vi får det minste elementet på tvers av alle koblede lister ved å gjøre dette. Det neste elementet blir deretter lagt til Min-Heap etter at vi har økt pekeren til listen som det nyutformede elementet tilhører. Et nytt element er hentet fra Min-Heap, den koblede listepekeren som inneholder den økes, og det nypekte elementet blir deretter lagt til Min-Heap. Inntil min-heapen er helt tom, gjentas denne operasjonen. Husk at vi kontinuerlig legger til elementene som vi trekker ut fra Min-Heap til en egen resultatliste som vi holder på.
Metodens fleksibilitet er en viktig fordel. Med noen få mindre justeringer kan denne tilnærmingen også brukes til å kombinere N -sorterte matriser. Noen av de andre måtene klarer ikke å gjøre dette, men denne tilnærmingen lykkes selv når alle koblede lister ikke er i samme størrelse.
Algoritme:
La oss først se på algoritmen for denne strategien før vi bruker et eksempel for å avklare den.
1) Lag en min-heap og fyll den med det første elementet fra hver av de "n" koblede listene.
2) Gjenta følgende handlinger frem til Min-Heap er fullstendig tom:
3) Returner resultatlistenes hodebueadresse.
For å forstå metoden bedre, la oss bruke et eksempel. La oss si at følgende koblede oppføringer blir gitt oss:
Elementet (1) av denne min-roothaugen er poppet. I dette tilfellet er varen som ble poppet fra den andre koblede listen. Siden den inneholder et nærliggende element (punkt 7), blir den andre koblede listens peker modifisert for å referere til punkt 7, og punkt 7 blir lagt til Min-Heap. Det nåværende ekstraherte elementet 1 legges til den endelige utgangsarrayen.
Det opprinnelige elementet som er 2 blir poppet og lagt til den nydannede koblede listen. Dermed blir pekeren til den tredje koblede listen endret til pek til neste element som er 7. Dette elementet legges til Min-Heap fordi 2 var medlem av denne koblede listen.
Nummer 4 fjernes fra Min-Heap og legges til den koblede listen som er den endelige koblede listeutfallet. Et nytt element (6) legges til Min-Heap, og pekeren til den første koblede listen blir endret for å peke på den.
Den resulterende koblede listen inkluderer nå den ekstraherte nummer 6. Siden element seks (6) tidligere var en del av den første koblede listen. Pekeren peker nå på følgende element (8), og dette elementet legges til Min-Heap.
Nok en gang tar vi rotnoden (7) og legger den til i min-heap. Mens pekeren til den andre koblede listen er oppdatert, blir ingen nye elementer lagt til Min-Heap fordi det ikke er noen i den andre koblede listen.
I dette tilfellet blir nummer 7 fra den tredje koblede listen poppet fra Min-Heap. Oppdateringer blir gjort til pekeren til den tredje koblede listen, og verdien 29 legges til minimumshaugen.
Denne gangen skal vi poppe nummer 8 da, vi flytter pekeren inn i den første koblede listen. Igjen blir ingen nye elementer lagt til Min-Heap fordi det ikke er noen igjen i den første koblede listen.
Det siste gjenværende elementet i Min-Heap, nummer 29, fjernes. Pekeren til den tredje koblede listen er oppdatert. Men siden det allerede er noen nye elementer på listen, er ingen lagt til.
Nå som Min-Heap er tom, kan vi bruke den koblede listen som ble generert som den sammenslåtte koblede listen. Dette er den endelige formen for den koblede listen som er produsert av denne algoritmen.
Forstå konseptene med kode og bilde
Vi har tre koblede lister som vist i følgende:
Merk: I starten er min haugen tom.
Vi legger til de første elementene i alle de koblede listene i bunken.
for (int i = 0; i < N; i++)Vi oppretter en resulterende koblet liste som vist på bildet:
struct node *headnode = newNode (0);Mens sløyfe utføres fordi Minheap ikke er tom (størrelse = 3 (> 0)).
Her trekker vi ut toppelementet fra stabelen og tildeler det til den resulterende tempnoden.
Toppelement (curr) = 2Nå, i denne koden, tildeler vi tempnoden med hele den koblede listen over det øverste elementet. Element 2 er inkludert i de andre tilkoblede listemedlemmene, som det kan sees i følgende bilde:
tempnode = tempnode-> neste; tempnode -> 2Så i det forrige bildet kan vi se at tempnode peker på Curr (toppelementet).
Nå, i dette trinnet, må vi sjekke om det nåværende toppelementet har et annet lenket listemedlem eller ikke. Hvis det fremdeles er medlem, legger vi til det elementet til haugen.
if (curr-> neste != Null)Vi legger til elementet nummer 5 til stabelen fordi det nåværende toppelementet var 2 og dets neste element er 5.
Igjen, vi følger de foregående trinnene.
Mens sløyfe utføres fordi Minheap ikke er tom (størrelse = 3 (> 0)). Her trekker vi ut toppelementet fra stabelen og tildeler det til den resulterende tempnoden.
Toppelement (curr) = 3Igjen, i denne koden, tildeler vi tempnoden med hele den koblede listen over det øverste elementet. Element 3 er inkludert i de andre tilkoblede listemedlemmene, som det kan sees i følgende bilde:
tempnode = tempnode-> neste; tempnode -> 3Merk: Den koblede listen over det tidligere nåværende toppelementet 2 blir overskrevet av den koblede listen over det nye toppmedlemmet.
Igjen, i dette trinnet, sjekker vi om det nåværende toppelementet har et annet lenket listemedlem eller ikke. Hvis det fremdeles er medlem, legger vi til det elementet til stabelen.
if (curr-> neste != Null)Vi legger til elementet nummer 4 til stabelen fordi det nåværende toppelementet var 3 og dets neste element er 4.
Igjen, vi følger de foregående trinnene.
Mens sløyfe utføres fordi Minheap ikke er tom (størrelse = 3 (> 0)).
Her trekker vi ut toppelementet fra stabelen og tildeler det til den resulterende tempnoden.
Toppelement (curr) = 4Igjen, i denne koden, tildeler vi tempnoden med hele den koblede listen over det øverste elementet. Element 4 er inkludert i de andre tilkoblede listemedlemmene, som det kan sees i følgende bilde. Og også, igjen, i dette trinnet, sjekker vi om det nåværende toppelementet har et annet lenket listemedlem eller ikke. Hvis det fremdeles er medlem, legger vi til det elementet til stabelen.
tempnode = tempnode-> neste;Vi legger til elementet nummer 6 til stabelen fordi det nåværende toppelementet var 4 og dets neste element er 6.
Nå settes element 5 inn.
tempnode -> 5Nå settes element 6 inn.
tempnode -> 6Curr (6)-> Neste == NULL fordi ingen element er tilgjengelig etter elementet 6. Så ingenting er lagt til i haugen.
Nå blir element 7 lagt til etter element 6.
tempnode -> 7Nå blir element 8 lagt til etter element 7.
tempnode -> 8Nå blir element 9 lagt til etter element 8.
tempnode -> 9Curr (9)-> Neste == NULL fordi ingen element er tilgjengelig etter elementet 9. Så ingenting er lagt til i haugen.
Til slutt legger vi til elementet 10 på listen.
Nå er haugen tom. Så sløyfen går i stykker og vi returnerer headnode.
Implementering av Heap -algoritmen for å slå sammen N -sorterte lister
#inkludereProduksjon:
Konklusjon
Vi lærte hvordan vi kan kombinere n -sorterte koblede lister i en enkelt sortert koblet liste i denne artikkelen. Vi ga et enkelt visuelt eksempel ved å bruke Min -haugen for å hjelpe deg med å forstå denne ideen. Etter det forklarte vi det også ved hjelp av kode og grafikk. Siden minimumshaugen var grunnlaget for denne metoden, forsøkte vi også å beskrive hvordan den fungerer i denne artikkelen. Denne metoden har en tidskompleksitet av O (n.Logg (k)) hvor n er antall noder i listen, og k er det totale antallet lister.