Teljes bináris fa

bináris fa

A fák között bocsát ki speciális alosztálya úgynevezett bináris fák. Bináris fa - gyökeres fa, hogy minden egyes csomóponthoz legfeljebb két leányvállalata, gyakran egyértelműen rendelhető: balra és jobbra. Például, ez egy bináris fa:

Teljes bináris fa

Között bináris fák különíteniük teljes bináris fa. amelynek minden csúcsa van két leányvállalata, kivéve a leveleket, amelyek székhelye azonos mélységben:

Teljes bináris fa

Azt is gyakran nevezik a teljes bináris fa, amely teljesen megtöltötte a szinten, kivéve az utolsót:

Teljes bináris fa

Amikor 1-csúcsok indexelése keresztül fentebb megadott szintek, vannak egyszerű képletek közötti átmenet csomópontok. Egy csúcsból index $ v $ képlet származású balra, csökkenő jobbra, és emelje fel a következők szerint:

$$ L = 2V \\ r = 2v + 1 \\ p = \ left \ lfloor \ right \ rfloor $$

Ebben a tekintetben a teljes bináris fák gyakran tárolják nem formájában a szomszédsági lista formájában egy egyszerű tömb, ahol a $ tree [v] $ - hozzárendelt érték a felső index $ v $. A bejárás segítségével fenti képletek.

Meg kell jegyezni, hogy a magasság (szintek száma) teljes bináris fa $ N $ csúcsok értéke $ \ log N $. Ez a tulajdonság gyakran használják, hogy értékelje a komplexitás, a különböző algoritmusok.

Egy csomó (angol kupac.) - az egyik legegyszerűbb adatszerkezetek alapján a fák. Egy rakás fenntartására használják elemekből álló készlet, amely képes gyorsan megtalálja a maximális (vagy minimális, nem számít).

Klasszikus csokor a következő műveleteket támogatja:

  • Elem hozzáadása (Nehézség: $ O (\ log N) $)
  • Keresse meg a maximális (Nehézség: $ O (1) $)
  • Kivonat a maximális elem (Nehézség: $ O (\ log N) $)

egy halom elemek formájában tároljuk a teljes bináris fa. Fő tulajdonság (a kupac invariáns) van megfogalmazva a következő:

Elem minden csomópont nagyobb vagy egyenlő elemek minden gyermek csúcsot.

Ebből az is következik, hogy a legkisebb elem mindig a gyökér a fa.

Teljes bináris fa

Ha hozzáad egy csomó új bejegyzés az első elérhető index. Ez azt jelenti, hogy a bináris fa van töltve a szintet, balról jobbra. Az adagolás befejezése után az elem lehetséges, hogy a kupac invariáns megszűnik végezni, mint egy új elem lesz nagyobb, mint a közvetlen őse. Ilyen esetekben egyszerűen cserélhető az elem a közvetlen őse. Ha a kupac invariáns még mindig nem elégedett, akkor változtassa meg a helyét egy új őse, és így tovább, amíg a kupac nem normális. Ez a művelet a rámenős felfelé.

Kibontásakor a maximális elem, akkor a következő trükköt: mozgassa az utolsó elem a kupac (a jobb szélső az utolsó szinten) a gyökér a fa helyett a távoli csúcs. Ez szinte biztosan sérti egy változatlan, mint az új „maximális” kevesebb lesz elemek gyermek csomópontok. Vessük össze a két gyermek elemek, válasszon egyet, és cserélt a jelenlegi „maximális”. Ismételjük meg ezt a folyamatot, amíg a invariáns nem áll helyre. Ez az úgynevezett push-down.

végrehajtás

A koncepció egy sorban prioritással

Hallja helyett a „csomó”, a „sornak”. A gyakorlatban ezek felcserélhetőek egymással, bár a különbség a érték még mindig jelen van.

A sorban elsőbbséget - egy absztrakt adatszerkezet, amely lehetővé teszi, hogy fenntartsák a sor elemeit, keresse meg és letölteni legalább belőle, míg egy csomó - konkrét adatok szerkezete alapján a teljes bináris fa. Bármilyen csokor egy prioritási sor, de nem minden sorban prioritást (elméletileg) egy halom (a gyakorlatban szinte bármilyen). Akkor végre támogatja a többszörös extrakció maximum egy egyszerű tömböt, akkor a műveleti bonyolultság $ O (N) $, de továbbra is kiemelt sorban.

(Ha még nem ismeri, objektumorientált programozás, a sorban prioritás - felület és egy csomó - egy osztály, amely végrehajtja azt.)

A sorban prioritást a szabványos C ++ library

A szabványos C ++ library kupac jelen végrehajtása, amely támogatja az összes műveletet a fent megadott. Ez az osztály std :: priority_queue. A munka a következő módszereket használnak, hogy:

Az alapértelmezés egy csomó, hogy megtalálják a legnagyobb. Ahhoz, hogy a kupac megtalálja a minimum meg kell használni a típus std :: priority_queue, nagyobb>

Kapcsolódó cikkek