Sobes.tech
Junior — Middle

Hogyan lehet hatékonyan eltávolítani egy dinamikus tömb első elemét állandó időben?

sobes.tech MI

Válasz az MI-től

Go-ban a dinamikus tömböket szeletek (slices) képviselik. Az első elem törlése egy szeletből általában eltolással történő szeletelés segítségével történik:

slice = slice[1:]

Ez az művelet állandó időben hajtódik végre, mivel nem másolja az elemeket, csak módosítja a mutatókat és a szelet hosszát.

Azonban, ha meg akarja tartani az eredeti tömböt és el akarja kerülni a nem használt memória felhalmozódását, használhat körgyűrűs puffert (ring buffer) vagy egy két indexet (kezdő és vég) használó sorozatot. Ez hatékonyan, O(1) időben törli az első elemet anélkül, hogy a többi elemet eltolná.

Példa körgyűrűs pufferről:

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
}

Ezért, az első elem hatékony, állandó időben történő törléséhez, jobb olyan adatszerkezetet használni, amely támogatja ezt a műveletet, mintsem közvetlenül egy szeletet.