Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 6 / 15 Dvejetainė paieška ~55 min
Kodas

Trys paieškos, du matavimo būdai

Sukurk search.go (žr. dešinėje). Jame yra trys paieškos, timeIt ir dvi komandos.

Kodėl kiekvienos paieškos yra po dvi versijas

Faile rasi LowerBound ir lowerBoundRaw. Tas pats algoritmas, tik antroji neturi skaitiklio.

Tai ne kopijavimas iš tingumo. Skaitiklis kviečiamas kartą per palyginimą — tiesinėje paieškoje n/2 kartų, dvejetainėje log n kartų. Matuodamas laiką su skaitikliu, tiesinę baudi maždaug 250 kartų smarkiau nei dvejetainę.

Pamatavau abiem būdais. Su skaitikliu lūžio taškas gaunasi ties n ≈ 3; be jo — ties n ≈ 6. Matavimo įrankis pastūmė matuojamą dydį dvigubai.

Ketvirtoje pamokoje skaitiklis nematė atminties. Čia jis pats keičia rezultatą. Skaičiuok viena versija, matuok kita.

Todėl timeIt kviečia ...Raw funkcijas, o skaitikliai renkami atskirai.

timeIt — atsakas į pirmos pamokos „wall 0s"

func timeIt(d time.Duration, f func()) (time.Duration, int)

Vieno paleidimo pamatuoti neįmanoma — pirmoje pamokoje laikrodis rodė 0s. timeIt kartoja, kol praeina bent d, ir dalija. Lygiai taip pat, ir dėl tos pačios priežasties, elgiasi transit.

Trys paieškos, vienas klausimas

LinearAtOrAfter, LowerBound ir LowerBoundStd grąžina tą patį. Jei negrąžintų, jų greičio lyginti nebūtų prasmės.

search_test.go (kitas žingsnis) tai įrodo prieš bet kokį matavimą — 620 skirtingų taikinių, visi trys sutampa. Ta pati tvarka, kurios laikosi transit: pirma įrodyk, kad tai ta pati funkcija, tik paskui matuok.