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.