Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 13 / 15 Krūvos ir prioritetinės eilės ~55 min
Kodas

Matavimo aplinka ir testai

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

komanda ką daro
algo top k geriausių: krūva prieš „surikiuok ir imk"
algo pq šeštos pamokos klausimas: tavo krūva prieš container/heap

heapbench.go taip pat turi stdItems — sąsają, kurios reikalauja container/heap. Pažvelk į jos parašus dabar; šeštame žingsnyje jie bus visas atsakymas:

func (s *stdItems) Push(x any)  { *s = append(*s, x.(Item)) }
func (s *stdItems) Pop() any    { ... }

Testai

testas ką reikalauja
TestPopComesOutAscending invariantas galioja po kiekvieno Push; ištuštinimas duoda didėjimo tvarką
TestHeightIsImpliedByLength Height() yra floor(log2 n)+1 visiems n iki 5 000
TestTheHeapIsNotSorted masyvas NĖRA surikiuotas — ir vis tiek yra krūva
TestTopKAgreesWithSortingAndCostsLess tie patys k įvertinimai, ir mažiau nei 2n palyginimų
TestTopKLosesWhenKApproachesN prie k = n krūva pralaimi rikiavimui

Du iš jų reikalauja, kad kažko nebūtų — ir abu saugo pamokos esmę.

„Nėra surikiuotas" yra saugiklis nuo pagerinimo, kuris viską sugriautų. Jei Push versi įterpimo rikiavimu, visi kiti testai praeis, o kaina iš O(log n) taps O(n). Krūva nerikiuoja — tai ne trūkumas, o būtent tai, ką ji parduoda mainais už greitį.

„Pralaimi prie k = n" yra sąžininga riba. Krūva laimi tik tol, kol k yra gerokai mažesnis už n; penktame žingsnyje pamatuosi, kur tiksliai persiverčia. Testas neleidžia to nutylėti.

Testų faile taip pat yra keturi Benchmark — jie reikalingi šeštam žingsniui, nes ten matuojamas dalykas, kurio skaitiklis nemato:

go test -run XXX -bench 'Heap|TopK' -benchtime=20x -count=5