Pratybos
Penkios užduotys. Visos — apie masyvo išdėstymą atmintyje, ne apie sintaksę.
1. InsertAt(items []Item, i int, it Item) []Item
Įterpia it į poziciją i ir grąžina naują slice.
Suskaičiuok, kiek elementų pasislinko. Padaryk tai su i = 0, i = n/2 ir
i = n. Kuris iš trijų yra O(1) ir kodėl?
2. DeleteAt(items []Item, i int) []Item
Ištrina elementą išlaikydamas tvarką.
Tada parašyk DeleteFast, kuris tvarkos neišlaiko: perkelia paskutinį
elementą į atsilaisvinusią vietą ir sutrumpina slice.
Kiek pasislinkimų kainuoja kiekvienas? Kada DeleteFast netinka?
3. Grow(n int) (reallocs, copied int)
Pakartok 2 žingsnio matavimą, bet be algo komandos — tik funkcija,
grąžinanti du skaičius.
Tada paleisk ją su make([]Item, 0, n) — iš anksto rezervuota talpa. Kiek
perkėlimų gauni? Paaiškink, kodėl.
4. MemoryPerItem(n int) float64
Suskaičiuok, kiek baitų vienam įrašui iš tikrųjų rezervuota, kai slice turi
n elementų: cap × dydis / n.
Paleisk su n nuo 1 iki 100. Kada santykis blogiausias? Susiek atsakymą su 2 žingsnio talpų seka.
5. Nulinės reikšmės spąstai
Kas nutinka, jei parašysi lib := make([]Item, 1000) ir tada append?
Parašyk trumpą programėlę, kuri tai parodo, ir paaiškink, kuo skiriasi
make([]Item, 1000) nuo make([]Item, 0, 1000). Šita klaida daroma nuolat.