Heapsort vremenska složenost

Heapsort Vremenska Slozenost



Heap Sort, napisano kao Heapsort, vrsta je algoritma za sortiranje. Uzima popis koji je djelomično uređen i iz njega proizvodi sortirani popis. Razvrstavanje može biti uzlazno ili silazno. U ovom članku sortiranje je uzlazno. Imajte na umu da heapsort ne sortira nepotpuno nesortirani popis. Razvrstava djelomično uređenu (sortiranu) listu. Taj djelomično uređeni popis je hrpa. U ovom članku, hrpa koja se razmatra je minimalna (uzlazna) hrpa.

Hrpa se naziva 'djelomično uređena', a ne 'djelomično sortirana'. Riječ 'sort' znači potpuno sređivanje (potpuno sortiranje). Hrpa nije djelomično uređena proizvoljno. Hrpa je djelomično uređena prema kriteriju (uzorku), kao što je prikazano u nastavku.

Dakle, heapsort se sastoji od dvije faze: izgradnje hrpe i izdvajanja uređenog elementa s vrha hrpe. U drugoj fazi, nakon svakog vađenja, gomila se ponovno gradi. Svaka ponovna izgradnja je brža od izvornog procesa izgradnje budući da se ponovna izgradnja vrši iz prethodne izgradnje, gdje je jedan element uklonjen. Uz to, heapsort razvrstava potpuno nesvrstan popis.







Cilj ovog članka je ukratko objasniti heapsort, a zatim prikazati njegovu vremensku složenost (pogledajte značenje vremenske složenosti u nastavku). Pred kraj, kodiranje se radi u C++.



Minimalna gomila

Hrpa može biti minimalna ili maksimalna hrpa. Max-heap je onaj gdje je prvi element najviši element, a cijelo stablo ili odgovarajući popis je djelomično poredan silaznim redoslijedom. Min-heap je onaj gdje je prvi element najmanji element, a cijeli popis je djelomično poredan uzlaznim redoslijedom. U ovom članku razmatra se samo minimalna hrpa. Napomena: u temi gomile, element se također naziva čvor.



Hrpa je potpuno binarno stablo. Binarno stablo se može izraziti kao polje (lista); čitajte od vrha prema dolje i slijeva na desno. Svojstvo hrpe za min-heap je da je nadređeni čvor manji ili jednak svakom od svoja dva djeteta. Primjer neuređenog popisa je:





9 19 24 5 3 jedanaest 14 22 7 6 17 petnaest ništavan ništavan ništavan
0 1 dva 3 4 5 6 7 8 9 10 jedanaest 12 13 14

Prvi red ove tablice su elementi niza. U drugom redu su indeksi temeljeni na nuli. Ovaj popis elemenata može se izraziti kao stablo. Dodani su nulti elementi kako bi se napravilo potpuno binarno stablo. Strogo govoreći, nulti elementi nisu dio liste (stabla). Ovaj popis nema redoslijed, tako da još nije hrpa. Postat će hrpa kada ima djelomično sređivanje, prema svojstvu hrpe.

Odnos između čvorova i indeksa

Upamtite, hrpa je potpuno binarno stablo prije konfiguracije hrpe (svojstvo hrpe). Prethodna lista još nije hrpa, jer elementi ne poštuju svojstvo hrpe. Postaje gomila nakon preuređivanja elemenata u djelomični redoslijed prema svojstvu min-hop. Djelomični poredak može se promatrati kao djelomično sortiranje (iako riječ 'sortiranje' znači potpuno poredak).



Bilo da je binarno stablo gomila ili ne, svaki roditelj ima dvoje djece, osim listova (zadnjih) čvorova. Postoji matematički odnos među indeksima između svakog roditelja i njegove djece. To je kako slijedi: Ako je roditelj na indeksu i, onda je lijevi dijete na indeksu:

dva * ja + 1

a desno dijete je na indeksu:

dva * ja + dva

Ovo je za indeksiranje temeljeno na nuli. I tako, roditelj na indeksu 0 ima lijevo dijete na indeksu 2×0+1=1 i desno dijete na 2×0+2=2. Roditelj na indeksu 1 ima lijevo dijete na indeksu 2×1+1=3 i desno dijete na indeksu 2×1+2=4; i tako dalje.

Po svojstvu min-heap, roditelj na i manji je ili jednak lijevom djetetu na 2i+1 i manji ili jednak desnom djetetu na 2i+2.

Hrpa

Nagomilavanje znači stvaranje gomile. To znači preurediti elemente popisa (ili odgovarajućeg stabla) tako da zadovolje svojstvo gomile. Na kraju procesa gomilanja, lista ili stablo je hrpa.

Ako se prethodni nesortirani popis gomila, postat će:

3 5 jedanaest 7 6 petnaest 14 22 9 19 17 24 ništavan ništavan ništavan
0 1 dva 3 4 5 6 7 8 9 10 jedanaest 12 13 14

Napomena: na popisu je 12 elemenata, a ne 15. U drugom redu su indeksi. U procesu izgradnje gomile, elemente je trebalo provjeriti, a neke zamijeniti.

Primijetite da je najmanji i prvi element 3. Ostali elementi slijede na uzlazni ali valovit način. Ako su lijevi i desni potomci na pozicijama 2i+1 i 2i+2 svaki veći ili jednaki roditelju na i, tada je ovo min-hrpa. Ovo nije potpuno sređivanje ili sortiranje. Ovo je djelomično sređivanje, prema svojstvu gomile. Odavde počinje sljedeća faza za heap sortiranje.

Heapify Time Complexity

Vremenska složenost je relativno vrijeme izvođenja nekog koda. Može se promatrati kao broj glavnih operacija koje taj kod treba izvršiti. Postoje različiti algoritmi za izgradnju hrpe. Najučinkovitiji i najbrži kontinuirano dijele popis na dva, provjeravajući elemente od dna, a zatim radeći neke izmjene elemenata. Neka je N broj praktičnih elemenata u listi. S ovim algoritmom, maksimalni broj glavnih operacija (zamjena) je N. Vremenska složenost za gomilanje je prethodno dana kao:

O ( n )

Gdje je n N i najveći mogući broj glavnih operacija. Ova notacija se naziva Big-O notacija. Počinje s O velikim slovima, nakon čega slijede zagrade. Unutar zagrada nalazi se izraz za najveći mogući broj operacija.

Upamtite: zbrajanje može postati množenje ako se ista stvar koja se dodaje stalno ponavlja.

Heapsort ilustracija

Prethodni nesortirani popis koristit će se za ilustraciju heapsort-a. Dati popis je:

9 19 24 5 3 jedanaest 14 22 7 6 17 petnaest

Min-heap proizveden iz liste je:

3 5 jedanaest 7 6 petnaest 14 22 9 19 17 24

Prva faza heapsort-a je stvaranje hrpe koja je proizvedena. Ovo je djelomično uređen popis. To nije sortirani (potpuno sortirani) popis.

Druga faza sastoji se od uklanjanja najmanjeg elementa, koji je prvi element, iz gomile, ponovnog gomilanja preostale hrpe i uklanjanja najmanje elemenata u rezultatima. Najmanji element uvijek je prvi element u ponovno gomilanoj hrpi. Elementi se ne uklanjaju i ne bacaju. Mogu se poslati u drugi niz redoslijedom kojim su uklonjeni.

Na kraju, novi niz bi imao sve elemente poredane (u potpunosti), uzlaznim redoslijedom; a ne više samo djelomično naručeno.

U drugoj fazi, prva stvar koju treba učiniti je ukloniti 3 i smjestiti ga u novi niz. Rezultati su:

3

i

5 jedanaest 7 6 petnaest 14 22 9 19 17 24

Preostali elementi moraju se gomilati prije izdvajanja prvog elementa. Gomila preostalih elemenata može postati:

5 6 7 9 petnaest 14 22 jedanaest 19 17 24

Izdvajanje 5 i dodavanje novom popisu (nizu) daje rezultate:

3 5

i

6 7 9 petnaest 14 22 jedanaest 19 17 24

Nagomilavanje preostalog skupa dalo bi:

6 7 9 petnaest 14 22 jedanaest 19 17 24

Izdvajanje 6 i dodavanje novom popisu (nizu) daje rezultate:

3 5 6

i

7 9 petnaest 14 22 jedanaest 19 17 24

Nagomilavanje preostalog skupa dalo bi:

7 9 jedanaest 14 22 petnaest 19 17 24

Izdvajanje 7 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7

i

9 jedanaest 14 22 petnaest 19 17 24

Nagomilavanje preostalog skupa daje:

9 jedanaest 14 22 petnaest 19 17 24

Izdvajanje 9 i dodavanje na novi popis daje rezultate:

3 5 6 7 9

i

jedanaest 14 22 petnaest 19 17 24

Nagomilavanje preostalog skupa daje:

jedanaest 14 17 petnaest 19 22 24

Izdvajanje 11 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest

i

14 17 petnaest 19 22 24

Nagomilavanje preostalog skupa dalo bi:

14 17 petnaest 19 22 24

Izdvajanje 14 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14

i

17 petnaest 19 22 24

Nagomilavanje preostalog skupa dalo bi:

petnaest 17 19 22 24

Izdvajanje 15 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14 petnaest

i

17 19 22 24

Nagomilavanje preostalog skupa dalo bi:

17 19 22 24

Izdvajanje 17 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14 petnaest 17

i

19 22 24

Nagomilavanje preostalog skupa dalo bi:

19 22 24

Izdvajanje 19 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14 petnaest 17 19

i

22 24

Nagomilavanje preostalog skupa daje:

22 24

Izdvajanje 22 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14 petnaest 17 19 22

i

24

Nagomilavanje preostalog skupa daje:

24

Izdvajanje 24 i njegovo dodavanje na novi popis daje rezultate:

3 5 6 7 9 jedanaest 14 petnaest 17 19 22 24

i

- - -

Niz hrpe je sada prazan. Svi elementi koje je imao na početku sada su u novom nizu (listi) i sortirani.

Heapsort algoritam

Iako je čitatelj možda pročitao u udžbenicima da se heapsort sastoji od dva stupnja, heapsort se još uvijek može vidjeti kao da se sastoji od jednog stupnja, koji se iterativno smanjuje iz zadanog niza. Uz to, algoritam za sortiranje heapsortom je sljedeći:

  • Povećajte nerazvrstani popis.
  • Izdvojite prvi element hrpe i stavite ga kao prvi element nove liste.
  • Povećajte preostali popis.
  • Izdvojite prvi element nove gomile i stavite ga kao sljedeći element nove liste.
  • Ponavljajte prethodne korake redom dok se popis hrpe ne isprazni. Na kraju se novi popis sređuje.

Heapsort Time Complexity Proper

Jednostupanjski pristup koristi se za određivanje vremenske složenosti heapsort-a. Pretpostavimo da postoji 8 nesortiranih elemenata koje treba sortirati.

Mogući najveći broj operacija za gomilanje 8 elementi je 8 .
The mogući najveći broj operacija za gomilanje preostalih 7 elementi je 7 .
The mogući najveći broj operacija za gomilanje preostalih 6 elementi je 6 .
The mogući najveći broj operacija za gomilanje preostalih 5 elementi je 5 .
The mogući najveći broj operacija za gomilanje preostalih 4 elementi je 4 .
The mogući najveći broj operacija za gomilanje preostalih 3 elementi je 3 .
The mogući najveći broj operacija za gomilanje preostalih dva elementi je dva .
The mogući najveći broj operacija za gomilanje preostalih 1 element je 1 .

Maksimalni mogući broj operacija je:

8 + 7 + 6 + 5 + 4 + 3 + dva + 1 = 36

Prosjek ovih brojeva operacija je:

36 / 8 = 4.5

Primijetite da se zadnje četiri hrpe u prethodnoj ilustraciji nisu promijenile kada je prvi element uklonjen. Neke od prethodnih gomila nisu se također promijenile kada je prvi element uklonjen. Time je bolji prosječni broj glavnih operacija (zamjena) 3 a ne 4,5. Dakle, bolji ukupni prosječni broj glavnih operacija je:

24 = 8 x 3
=> 24 = 8 x log < pod > dva < / pod > 8

jer log dva 8 = 3.

Općenito, prosječna složenost slučaja za heapsort je:

O ( n. log2n )

Gdje točka znači množenje, a n je N, ukupan broj elemenata na popisu (bilo koji popis).

Imajte na umu da je operacija izdvajanja prvog elementa zanemarena. Na temu Vremenska složenost, operacije koje traju relativno kratko vrijeme se zanemaruju.

Kodiranje u C++

U biblioteci algoritama C++ postoji funkcija make_heap(). Sintaksa je:

šablona < razreda RandomAccessIterator, razreda Usporedi >
constexpr poništiti napraviti hrpu ( RandomAccessIterator prvi, RandomAccessIterator zadnji, Usporedi komp ) ;

Uzima iterator koji pokazuje na prvi element vektora kao prvi argument, a zatim iterator koji pokazuje neposredno iza kraja vektora kao posljednji argument. Za prethodni nesortirani popis, sintaksa bi se koristila kako slijedi kako bi se dobila minimalna gomila:

vektor < int > vtr = { 9 , 19 , 24 , 5 , 3 , jedanaest , 14 , 22 , 7 , 6 , 17 , petnaest } ;
vektor < int > :: iterator iterB = vtr. početi ( ) ;
vektor < int > :: iterator iterE = vtr. kraj ( ) ;
napraviti hrpu ( iterB, iterE, veći < int > ( ) ) ;

Ovaj kod mijenja vektorski sadržaj u konfiguraciju minimalne gomile. U sljedećim C++ vektorima, dva će se vektora koristiti umjesto dva niza.

Za kopiranje i vraćanje prvog elementa vektora upotrijebite vektorsku sintaksu:

constexpr referentna prednja strana ( ) ;

Da biste uklonili prvi element vektora i bacili ga, koristite sintaksu vektora:

constexpr brisanje iteratora ( pozicija const_iterator )

Da biste dodali element iza vektora (sljedeći element), koristite vektorsku sintaksu:

constexpr poništiti odgurnuti ( konst T i x ) ;

Početak programa je:

#include
#include
#uključi
korištenjem imenski prostor std ;

Uključene su algoritam i vektorske biblioteke. Sljedeća u programu je funkcija heapsort(), koja je:

poništiti heapsort ( vektor < int > i stariV, vektor < int > i novoV ) {
ako ( stariV. veličina ( ) > 0 ) {
vektor < int > :: iterator iterB = stariV. početi ( ) ;
vektor < int > :: iterator iterE = stariV. kraj ( ) ;
napraviti hrpu ( iterB, iterE, veći < int > ( ) ) ;

int Sljedeći = stariV. ispred ( ) ;
stariV. izbrisati ( iterB ) ;
novoV. odgurnuti ( Sljedeći ) ;
heapsort ( stariV, noviV ) ;
}
}

To je rekurzivna funkcija. Koristi funkciju make_heap() biblioteke C++ algoritama. Drugi segment koda u definiciji funkcije izdvaja prvi element iz starog vektora nakon izgradnje gomile i dodaje kao sljedeći element za novi vektor. Imajte na umu da su u definiciji funkcije vektorski parametri reference, dok se funkcija poziva s identifikatorima (imenima).

Prikladna C++ glavna funkcija za ovo je:

int glavni ( int argc, char ** argv )
{
vektor < int > stariV = { 9 , 19 , 24 , 5 , 3 , jedanaest , 14 , 22 , 7 , 6 , 17 , petnaest } ;
vektor < int > novoV ;
heapsort ( stariV, noviV ) ;

za ( int ja = 0 ; ja < novoV. veličina ( ) ; ja ++ ) {
cout << novoV [ ja ] << ' ' ;
}
cout << endl ;

povratak 0 ;
}

Izlaz je:

3 5 6 7 9 jedanaest 14 petnaest 17 19 22 24

sortiran (potpuno).

Zaključak

U članku se detaljno raspravlja o prirodi i funkciji Heap Sort-a, poznatog kao Heapsort, kao algoritma za sortiranje. Heapify Time Complexity, Heapsort ilustracija i Heapsort kao algoritam obrađeni su i potkrijepljeni primjerima. Prosječna vremenska složenost za dobro napisan heapsort program je O(nlog(n))