Sobes.tech
Junior — Middle

Ako efektívne odstrániť prvý prvok z dynamického poľa v konštantnom čase?

sobes.tech AI

Odpoveď od AI

V Go sú dynamické polia reprezentované pomocou rezov (slices). Odstránenie prvého prvku z rezov sa zvyčajne vykonáva pomocou posunutého rezovania:

slice = slice[1:]

Táto operácia sa vykonáva v konštantnom čase, pretože nekopíruje prvky, iba mení ukazovatele a dĺžku rezov.

Ak však chcete zachovať pôvodné pole a vyhnúť sa hromadeniu nevyužitej pamäti, môžete použiť kruhový buffer (ring buffer) alebo frontu implementovanú na základe rezov s dvoma indexmi (začiatok a koniec). To umožní efektívne odstrániť prvý prvok v O(1), bez posúvania ostatných prvkov.

Príklad kruhového bufferu:

type RingBuffer struct {
    data []int
    start int
    size  int
}

func (r *RingBuffer) PopFront() int {
    if r.size == 0 {
        panic("buffer is empty")
    }
    val := r.data[r.start]
    r.start = (r.start + 1) % len(r.data)
    r.size--
    return val
}

Preto je efektívnejšie použiť dátovú štruktúru, ktorá podporuje túto operáciu, než priamo s rezom.