Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 4 / 15 Stekai ir eilės ~50 min
Kodas

Trys būdai imti iš priekio

Sukurk queue.go (žr. dešinėje). Jame yra History (stekas), trys eilės variantai ir Ring.

heapKB iškviečia šiukšlių surinkėją ir grąžina, kiek atmintyje liko gyva. Kodėl to reikia — paaiškės po minutės.

Rezultatas

$ algo queue -n 100000
enqueue 100000 items, then dequeue every one

strategy                   elements moved
q = q[1:]                               0
copy-down                      4999950000
ring buffer                             0

Palygink su savo spėjimu.

q = q[1:] pajudina nulį elementų. Ne mažai — nulį. Slice antraštė yra rodyklė, len ir cap; pastumti ją į priekį reiškia pridėti prie rodyklės vieną elementą ir sumažinti len. Duomenys nejuda niekur.

copy-down pajudina penkis milijardus. Tiksliai 4 999 950 000. Kiekvienas išėmimas pastumia visus likusius, tad iš viso n(n−1)/2. Padidink n dešimt kartų — skaičius užaugs šimtą:

n pastūmimai
1 000 499 500
10 000 49 995 000
100 000 4 999 950 000

Tai O(n²), ir taip atsitiko dėl vienos eilutės, kuri atrodė nekaltai.

Žiedinis buferis pajudina nulį. Kaip ir A variantas.

Taigi A variantas laimėjo?

Pagal skaitiklį — taip. A ir C lygūs, ir abu sutriuškino B.

Skaitiklis klysta. Tiksliau — skaitiklis atsako į klausimą, kurio neužtekome paklausti.