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

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.