Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 1 / 15 Įvadas ir sudėtingumas — Big-O ~55 min
Kodas

Matavimo įrankis

Dabar — matavimo įrankis. Tai vienintelis kodas, kurį šiame kurse gauni gatavą. Viską kitą rašai pats.

Gauni jį dėl dviejų priežasčių: skaičiavimas nėra įdomioji jokio algoritmo dalis, ir kiekviena pamoka turi matuoti tuo pačiu matu, kitaip skaičių nebus galima lyginti.

Sukurk metrics/counter.go ir main.go (žr. dešinėje).

Kodėl skaičiuojam veiksmus, o ne sekundes

Paleisk savo paiešką tūkstančio įrašų bibliotekoje ir pamatuok laikrodžiu. Štai kas gaunasi (Windows, tikras paleidimas):

n = 1000, ieškom pavadinimo, kurio nėra
  run 1:  wall 0s           comparisons 1000
  run 2:  wall 0s           comparisons 1000
  run 3:  wall 0s           comparisons 1000
  run 4:  wall 0s           comparisons 1000
  run 5:  wall 0s           comparisons 1000

Laikrodis sako 0 s. Ne „greitai" — nulis. Darbas įvyko: tūkstantis palyginimų, penkis kartus iš eilės, tas pats skaičius. Bet operacinės sistemos laikrodžio skyra per stambi, kad tai pamatytų.

Tai ne teorinis pavyzdys. Būtent ši klaida buvo rasta ir ištaisyta transit programoje, iš kurios paimti šios pamokos skaičiai: trumpesni nei milisekundė paleidimai rodė „0s", „dėl to greičiausia realizacija atrodė ne greita, o neišmatuota".

Palyginimų skaičius neturi nė vienos iš šių problemų:

  • jis tikslus — 1000, ne „apie tūkstantį";
  • jis determinuotas — paleisk šimtą kartų, gausi tą patį;
  • jis nepriklauso nuo technikos — tavo skaičius sutaps su bendraklausio, net jei jo kompiuteris dukart greitesnis.

Dėl paskutinio punkto įmanomi visų vėlesnių pamokų testai: testas gali reikalauti „ne daugiau kaip tiek palyginimų", ir tai reiškia tą patį visiems.