Sobes.tech
Junior — Middle

Cum se poate elimina eficient primul element dintr-un array dinamic în timp constant?

sobes.tech AI

Răspuns de la AI

În Go, array-urile dinamice sunt reprezentate prin slices. Eliminarea primului element dintr-un slice se face de obicei printr-un slicing deplasat:

slice = slice[1:]

Această operație se realizează în timp constant, deoarece nu copiază elementele, ci doar modifică pointerii și lungimea slice-ului.

Cu toate acestea, dacă dorești să păstrezi array-ul original și să eviți acumularea de memorie neutilizată, poți folosi un buffer circular (ring buffer) sau o coadă implementată pe baza unui slice cu doi indici (început și sfârșit). Acest lucru va permite eliminarea eficientă a primului element în O(1), fără a deplasa celelalte elemente.

Exemplu de buffer circular:

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
}

Prin urmare, pentru eliminarea primului element în timp constant, este mai bine să folosești o structură de date care suportă această operație, decât să lucrezi direct cu un slice.