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

Testas tikrina savybę, ne rezultatą

Trys failai: matavimo aplinka, testai ir trys naujos komandos.

komanda ką daro
algo balance pirmo žingsnio lentelė: BST ir AVL, dvi įterpimo tvarkos
algo rotate kaina — pastatymo palyginimai, laikas ir rotacijų skaičius
algo reload atsakymas į vienuoliktos pamokos pirmąją pratybų užduotį

Testai tikrina savybę, ne rezultatą

Šis skirtumas svarbus, todėl verta jį įvardyti.

Visų ankstesnių pamokų testai tikrino išvestį: ar surikiuota, ar rastas raktas, ar palyginimų mažiau nei tiek. Tokį testą iš principo galima praeiti kitokiu algoritmu, negu prašyta.

TestHeightStaysBoundedOnSortedInput tikrina formą:

bound := 1.4405*math.Log2(float64(n)+2) - 0.3277
if float64(avl.Height()) > bound {
	t.Errorf("n=%d: height %d exceeds the AVL bound %.1f", n, avl.Height(), bound)
}

Įvestis — griežtai didėjanti, ta pati, kuri sunaikino vienuoliktos pamokos medį.

Vienuoliktos pamokos BST čia grąžina kiekvieną raktą teisingai. Keys() surikiuotas. Get niekada neklysta. Ir vis dėlto:

n=  1000: height 1000 exceeds the AVL bound 14.0  (71x over)
n= 10000: height 10000 exceeds the AVL bound 18.8  (532x over)

532 kartai. Teisingų atsakymų čia neužtenka nė iš tolo — praeina tik forma.

testas ką reikalauja
TestAVLStoresAndFinds randa visus įdėtus, neranda neįdėto
TestRotationsPreserveTheOrdering BST invariantas ir balance nuo −1 iki 1 statymo metu, ne tik pabaigoje
TestHeightStaysBoundedOnSortedInput aukštis ir palyginimai neviršija AVL ribos
TestHeightStaysBoundedOnEveryAdversarialOrder tas pats didėjančiai, mažėjančiai ir zigzago tvarkai
TestRotationsAreAmortizedConstant rotacijų vienam įterpimui skaičius neauga su n

Antrasis tikrina kas 97 įterpimą, o ne pabaigoje. Klaidinga rotacija dažnai sugadina medį laikinai, o vėlesni įterpimai atsitiktinai jį „ištaiso"; tikrinant tik pabaigoje tokia klaida praslysta.

Ketvirtasis paima trečią blogiausią tvarką iš vienuoliktos pamokos namų darbo — zigzagą, kuris irgi duodavo aukštį n.