Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 12 / 15 Subalansuoti medžiai (AVL) ~55 min
Teorija

Šalinimo čia nėra — ir kiek tai kainuoja

avl.go neturi Delete. Tai sprendimas, ne spraga, ir verta pasakyti, kiek jis kainuoja.

Ką reikštų jį parašyti

Šalinimas iš AVL medžio yra vienuoliktos pamokos antroji pratybų užduotis (lapas / vienas vaikas / du vaikai su įpėdiniu), o po jos — rebalance grįžtant atgal. Realizuota ir pamatuota:

po 10 000 šalinimų iš 20 000: len 10000, aukštis 14 (riba 18.8), 4997 rotacijos

Veikia. Riba laikosi. Tvarka išlieka.

Kiek kodo:

eilučių (be komentarų ir tuščių)
Put 21
Delete 40

Medžio keitimo kodas išauga nuo 21 iki 61 eilutės — maždaug trigubai.

Ir kiek naujo iš to sužinotum

Nieko.

Rotacijos yra tos pačios keturios. rebalance — ta pati funkcija, neliesta. Invariantas — tas pats. Riba — ta pati.

Nauja tik du dalykai, ir abu yra buhalterija, ne idėja:

  • šalinant du vaikus turintį mazgą, taisyti reikia įpėdinio kelią, ne šalinamo mazgo;
  • įterpiant pakanka vienos taisymo vietos — po jos aukščiai nustoja keistis; šalinant taisymas gali kilti iki pat šaknies.

Antrasis punktas yra vienintelis tikras skirtumas ir jis telpa į vieną sakinį. Už jį mokėti keturiasdešimt eilučių ir pusę pamokos — bloga mainų sąlyga.

Šios pamokos idėja yra invariantas, kuris apriboja aukštį, ir jį jau turi. Šalinimas tą pačią idėją pritaiko dar vienoje vietoje.

Todėl šalinimas yra kursinio darbo pasirinkimas, o ne pamokos žingsnis. Kas nori — turi viską, ko reikia: rotacijas, rebalance, ribą ir testą, kuris pasakys, ar pavyko.

Kur tokie medžiai iš tikrųjų gyvena

Trumpai, nes patikrinta, o ne spėta.

transit subalansuoto medžio neturi — vienuoliktoje pamokoje buvo peržiūrėti visi repozitorijos tipai ir medžio ten nėra jokio. Jam ir nereikia: jo indeksai statomi vieną kartą ir nebekeičiami, o tokiu atveju surikiuotas masyvas su dvejetaine paieška yra tobulai subalansuotas veltui.

Ir Go standartinėje bibliotekoje jo nėra. Visas container paketas yra:

container/heap    container/list    container/ring

Krūva, dvikryptis sąrašas ir žiedas. Jokio medžio. Go tvarkingą aibę siūlo kitaip — surikiuok griežinį ir naudok sort.Search, tą patį lowerBound, kurį rašei šeštoje pamokoje.

Tai nereiškia, kad subalansuoti medžiai nereikalingi. Tai reiškia, kad jie gyvena ten, kur duomenys nuolat keičiasi ir turi likti tvarkingi — duomenų bazių indeksuose, failų sistemose, branduolio planuoklėse. Tavo bibliotekos indeksas yra kaip tik toks: Put gali būti iškviesta bet kada.