Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 2 / 15 Masyvai ir dinaminiai masyvai ~45 min
Kodas

Prijungiam load ir stats

Prijunk naujas komandas prie main.go. Pakeitimas mažas — dvi case eilutės ir dvi eilutės pagalboje — bet failas dešinėje rodomas visas, kad matytum, kur jos įsiterpia.

$ algo gen -n 1000 -seed 42
wrote 1000 items to library.jsonl (seed=42, order=shuffled, dup-rate=0.00)

$ algo load
loaded 1000 items from library.jsonl
slice: len=1000 cap=1024 — 24 slots reserved and unused

Tūkstantis įrašų, o vietos rezervuota 1024. Dvidešimt keturios tuščios vietos — tai kaina už tai, kad kiti 24 append bus pigūs. Toks mainas: atmintis mainoma į laiką, ir taip bus visame kurse.

Tikroje sistemoje: kai antraštė kainuoja daugiau už duomenis

transit — veikianti Vilniaus viešojo transporto programa — saugo grafą kaip vieną plokščią masyvą, o ne kaip masyvą masyvų. Jos kode tai paaiškinta vienu sakiniu: prie ~400 000 briaunų masyvų masyvas iššvaistytų megabaitus vien antraštėms.

Suskaičiuok pats. Grafas turi 206 875 viršūnes. Jei kiekviena laikytų savo []int kaimynų sąrašą, tai būtų 206 875 slice antraštės × 24 baitai:

206 875 × 24 B ≈ 4,96 MB

Penki megabaitai, kuriuose nėra nė vienos briaunos — vien rodyklės, len ir cap. Ir tai dar prieš pačias briaunas, ir prieš tai, kad 206 875 atskiri maži masyvai gulėtų išbarstyti po atmintį, o ne iš eilės.

Tai projektavimo pastaba, ne matavimas

transit autoriai šito nepamatavo — tai sprendimas, priimtas skaičiuojant, ir taip jis užrašytas jų kode. Skaičius viršuje irgi apskaičiuotas, o ne pamatuotas. Skirk šiuos dalykus: 2 žingsnio lentelė yra matavimas, ši pastraipa — argumentas. Abu naudingi, bet tik vienas iš jų yra įrodymas.