logo

AVL medis

AVL Tree išrado GM Adelson - Velsky ir EM Landis 1962 m. Medis pavadintas AVL jo išradėjų garbei.

kaip pakeisti eilutę į int

AVL medis gali būti apibrėžtas kaip subalansuoto aukščio dvejetainis paieškos medis, kuriame kiekvienas mazgas yra susietas su balanso koeficientu, kuris apskaičiuojamas atimant jo dešiniojo pomedžio aukštį iš kairiojo pomedžio aukščio.

Sakoma, kad medis yra subalansuotas, jei kiekvieno mazgo balanso koeficientas yra nuo -1 iki 1, kitaip medis bus nesubalansuotas ir jį reikės subalansuoti.

Balanso koeficientas (k) = aukštis (kairė (k)) - aukštis (dešinė (k))

Jei bet kurio mazgo balanso koeficientas yra 1, tai reiškia, kad kairysis pomedis yra vienu lygiu aukščiau nei dešinysis pomedis.

Jei bet kurio mazgo balanso koeficientas yra 0, tai reiškia, kad kairiojo ir dešiniojo pomedžio aukštis yra vienodas.

Jei bet kurio mazgo balanso koeficientas yra -1, tai reiškia, kad kairysis pomedis yra vienu lygiu žemiau nei dešinysis pomedis.

AVL medis pateiktas toliau pateiktame paveikslėlyje. Matome, kad su kiekvienu mazgu susietas balanso koeficientas yra nuo -1 iki +1. todėl tai yra AVL medžio pavyzdys.

AVL medis

Sudėtingumas

Algoritmas Vidutinis atvejis Blogiausiu atveju
Erdvė o(n) o(n)
Paieška o (log n) o (log n)
Įdėti o (log n) o (log n)
Ištrinti o (log n) o (log n)

Operacijos AVL medyje

Dėl to, kad AVL medis taip pat yra dvejetainis paieškos medis, todėl visos operacijos atliekamos taip pat, kaip ir dvejetainiame paieškos medyje. Paieškos ir važiavimas nesukelia AVL medžio savybių pažeidimo. Tačiau įterpimas ir ištrynimas yra operacijos, kurios gali pažeisti šią savybę, todėl jas reikia peržiūrėti dar kartą.

SN Operacija apibūdinimas
1 Įdėjimas Įterpimas į AVL medį atliekamas taip pat, kaip ir dvejetainiame paieškos medyje. Tačiau tai gali sukelti AVL medžio savybių pažeidimą, todėl medį gali reikėti subalansuoti. Medį galima subalansuoti taikant sukimus.
2 Ištrynimas Ištrynimas taip pat gali būti atliekamas taip pat, kaip ir dvejetainiame paieškos medyje. Ištrynimas taip pat gali sutrikdyti medžio pusiausvyrą, todėl medžio pusiausvyrai atkurti naudojami įvairūs sukimosi tipai.

Kodėl AVL medis?

AVL medis kontroliuoja dvejetainio paieškos medžio aukštį, neleidžiant jam būti iškreiptam. Laikas, per kurį atliekamos visos operacijos dvejetainiame paieškos medyje, kurio aukštis h yra Oi) . Tačiau jis gali būti pratęstas iki O(n) jei BST pasislenka (t. y. blogiausiu atveju). Apribojant šį aukštį iki log n, AVL medis nustato viršutinę kiekvienos operacijos ribą O(log n) kur n yra mazgų skaičius.

AVL rotacijos

Sukimą AVL medyje atliekame tik tuo atveju, jei Balance Factor yra kitoks nei -1, 0 ir 1 . Iš esmės yra keturi sukimosi tipai, kurie yra tokie:

  1. L L pasukimas: įterptas mazgas yra kairiajame A kairiojo pomedžio pomedyje
  2. R R pasukimas : įterptas mazgas yra dešiniajame A dešiniojo pomedžio pomedyje
  3. L R pasukimas : įterptas mazgas yra kairiajame A pomedžio dešiniajame pomedyje
  4. R L pasukimas : įterptas mazgas yra kairiajame dešiniojo A pomedžio pomedyje

Kur mazgas A yra mazgas, kurio balanso koeficientas yra kitoks nei -1, 0, 1.

Pirmieji du pasukimai LL ir RR yra pavieniai, o kiti du sukimai LR ir RL yra dvigubi. Kad medis būtų nesubalansuotas, minimalus aukštis turi būti bent 2, Supraskime kiekvieną sukimąsi

1. RR rotacija

Kai BST tampa nesubalansuotas, dėl to, kad į dešinįjį A dešiniojo pomedžio pomedį įterpiamas mazgas, atliekame RR sukimą, RR sukimas yra sukimas prieš laikrodžio rodyklę, kuris taikomas krašte po mazgu, kurio balanso koeficientas -2

AVL rotacijos

Aukščiau pateiktame pavyzdyje mazgas A turi balanso koeficientą -2, nes mazgas C yra įterptas į dešinįjį A dešiniojo pomedžio pomedį. RR pasukimą atliekame krašte žemiau A.

2. LL Rotacija

Kai BST tampa nesubalansuotas, dėl to, kad į kairiojo C kairiojo pomedžio kairįjį pomedį įterpiamas mazgas, atliekame LL sukimą, LL sukimas yra sukimas pagal laikrodžio rodyklę, kuris taikomas krašte po mazgu, kurio balanso koeficientas 2.

AVL rotacijos

Aukščiau pateiktame pavyzdyje mazgas C turi balanso koeficientą 2, nes mazgas A yra įterptas į kairiojo C kairiojo pomedžio kairįjį pomedį. Atliekame LL pasukimą krašte žemiau A.

3. LR Rotacija

Dvigubas sukimasis yra šiek tiek sunkesnis nei vienas sukimas, kuris jau buvo paaiškintas aukščiau. LR sukimas = RR sukimas + LL pasukimas, t.y. pirmiausia RR sukimas atliekamas ant pomedžio, o po to LL sukimas atliekamas visame medyje, pilnu medžiu reiškia pirmąjį mazgą nuo įterpto mazgo kelio, kurio balanso koeficientas yra kitoks nei -1 , 0 arba 1.

režisierius Karanas Joharas

Supraskime kiekvieną žingsnį labai aiškiai:

valstybė Veiksmas
AVL rotacijos Mazgas B buvo įterptas į dešinįjį A pomedį, į kairįjį C pomedį, dėl kurio C tapo nesubalansuotu mazgu, turinčiu balanso koeficientą 2. Šis atvejis yra L R sukimas, kur: Įterptas mazgas yra kairiojo pomedžio dešiniajame pomedyje. C
AVL rotacijos Kadangi LR sukimas = RR + LL pasukimas, tai pirmiausia atliekamas RR (prieš laikrodžio rodyklę) ant pomedžio, kurio šaknys yra A. Atlikdami RR sukimąsi, mazgas A , tapo kairiuoju pomedžiu B .
AVL rotacijos Atlikus RR sukimą, mazgas C vis dar yra nesubalansuotas, t. y. turi balanso koeficientą 2, nes įterptas mazgas A yra kairėje arba kairėje C
AVL rotacijos Dabar mes atliekame LL sukimąsi pagal laikrodžio rodyklę visame medyje, ty mazge C. mazgas C dabar tapo dešiniuoju mazgo B pomedžiu, o A yra kairiuoju B pomedžiu
AVL rotacijos Kiekvieno mazgo balanso koeficientas dabar yra -1, 0 arba 1, t. y. BST dabar subalansuotas.

4. RL sukimasis

Kaip jau buvo aptarta, šis dvigubas sukimasis yra šiek tiek sunkesnis nei vienas sukimas, kuris jau buvo paaiškintas aukščiau. R L sukimas = LL pasukimas + RR pasukimas, t.y. pirmiausia LL sukimas atliekamas ant pomedžio, o po to RR sukimas atliekamas visame medyje, pilnu medžiu reiškia pirmąjį mazgą nuo įterpto mazgo kelio, kurio balanso koeficientas yra kitoks nei -1 , 0 arba 1.

valstybė Veiksmas
AVL rotacijos Mazgas B buvo įterptas į kairįjį pomedį C dešinysis pomedis A , dėl kurio A tapo nesubalansuotu mazgu, kurio balanso koeficientas - 2. Šis atvejis yra RL sukimasis kur: Įterptas mazgas yra dešiniojo A pomedžio kairėje
AVL rotacijos Kadangi RL sukimas = LL pasukimas + RR pasukimas, taigi, LL (pagal laikrodžio rodyklę) ant pomedžio, įsišaknijusio C atliekama pirmiausia. Atlikdami RR sukimąsi, mazgas C tapo tinkamu pomedžiu B .
AVL rotacijos Atlikus LL sukimąsi, mazgas A vis dar nesubalansuotas, t. y. turi balanso koeficientą -2, kuris atsiranda dėl dešiniojo pomedžio mazgo A dešiniojo pomedžio.
AVL rotacijos Dabar atliekame RR sukimąsi (sukimas prieš laikrodžio rodyklę) visame medyje, ty mazge A. mazgas C dabar tapo dešiniuoju mazgo B pomedžiu, o mazgas A tapo kairiuoju B pomedžiu.
AVL rotacijos Kiekvieno mazgo balanso koeficientas dabar yra -1, 0 arba 1, t. y. BST dabar yra subalansuotas.

Klausimas: Sukurkite AVL medį, turintį šiuos elementus

H, I, J, B, A, E, C, F, D, G, K, L

1. Įterpkite H, I, J

AVL rotacijos

Įterpus aukščiau nurodytus elementus, ypač H atveju, BST tampa nesubalansuotas, nes H balanso koeficientas yra -2. Kadangi BST yra į dešinę, mes atliksime RR sukimąsi mazge H.

Gautas balanso medis yra:

referencinis kintamasis Java
AVL rotacijos

2. Įterpkite B, A

AVL rotacijos

Įterpus aukščiau nurodytus elementus, ypač A atveju, BST tampa nesubalansuotas, nes H ir I balanso koeficientas yra 2, mes atsižvelgiame į pirmąjį mazgą iš paskutinio įterpto mazgo, t. y. H. Kadangi BST iš H yra pasviręs į kairę, atliksime LL sukimąsi mazge H.

Gautas balanso medis yra:

AVL rotacijos

3. Įdėkite E

AVL rotacijos

Įterpus E, BST tampa nesubalansuotas, nes I balanso koeficientas yra 2, nes jei keliaujame iš E į I, pamatysime, kad jis yra įterptas į dešinįjį I pomedžio kairįjį pomedį, atliksime LR sukimą I mazge. LR = RR + LL sukimasis

3 a) Pirmiausia atliekame RR pasukimą mazge B

Gautas medis po RR pasukimo yra:

AVL rotacijos

3b) Pirmiausia atliekame LL sukimąsi mazge I

Gautas subalansuotas medis po LL sukimosi yra:

AVL rotacijos

4. Įterpkite C, F, D

AVL rotacijos

Įterpus C, F, D, BST tampa nesubalansuotas, nes B ir H balanso koeficientas yra -2, nes jei keliaujame iš D į B, pamatysime, kad jis yra įterptas į dešinįjį kairiojo B pomedžio pomedį, atliksime RL sukimasis mazge I. RL = LL + RR sukimas.

4a) Pirmiausia atliekame LL pasukimą mazge E

Gautas medis po LL pasukimo yra:

katalogo pervadinimas
AVL rotacijos

4b) Tada atliekame RR sukimąsi mazge B

Gautas subalansuotas medis po RR pasukimo yra:

AVL rotacijos

5. Įdėkite G

AVL rotacijos

Įterpus G, BST tampa nesubalansuotas, nes H balanso koeficientas yra 2, nes jei keliaujame iš G į H, pamatysime, kad jis yra įterptas į dešiniojo H pomedžio kairįjį pomedį, atliksime LR sukimą I mazge. LR = RR + LL sukimasis.

atsitiktinis skaičius gen java

5 a) Pirmiausia atliekame RR sukimąsi mazge C

Gautas medis po RR pasukimo yra:

AVL rotacijos

5 b) Tada atliekame LL sukimąsi mazge H

Gautas subalansuotas medis po LL sukimosi yra:

AVL rotacijos

6. Įdėkite K

AVL rotacijos

Įterpus K, BST tampa nesubalansuotas, nes I balanso koeficientas yra -2. Kadangi BST yra į dešinę nuo I iki K, todėl mazge I atliksime RR sukimąsi.

Gautas subalansuotas medis po RR pasukimo yra:

AVL rotacijos

7. Įdėkite L

Įdėjus L medis vis dar yra subalansuotas, nes kiekvieno mazgo balanso koeficientas dabar yra -1, 0, +1. Taigi medis yra subalansuotas AVL medis

AVL rotacijos