Sobes.tech
Junior — Middle

Kako efikasno ukloniti prvi element iz dinamičkog niza u konstantnom vremenu?

sobes.tech АИ

Одговор од АИ

U Go, dinamički nizovi su predstavljeni pomoću rezova (slices). Brisanje prvog elementa iz rezova obično se vrši pomoću pomerene sečenja:

slice = slice[1:]

Ova operacija se izvršava u konstantnom vremenu, jer ne kopira elemente, već samo menja pokazivače i dužinu sečenja.

Međutim, ako želite da sačuvate originalni niz i izbegnete nakupljanje neiskorišćenog memorijskog prostora, možete koristiti kružni bafer (ring buffer) ili red koji je implementiran na osnovu rezova sa dva indeksa (početak i kraj). To će omogućiti efikasno uklanjanje prvog elementa u O(1), bez pomeranja ostalih elemenata.

Primer kružnog bafera:

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
}

Stoga, za efikasno uklanjanje prvog elementa u konstantnom vremenu, bolje je koristiti strukturu podataka koja podržava tu operaciju, nego direktno sa rezom.