Sobes.tech
Junior — Middle

Comment peut-on supprimer efficacement le premier élément d'un tableau dynamique en temps constant?

sobes.tech IA

Réponse de l'IA

En Go, les tableaux dynamiques sont représentés par des slices. La suppression du premier élément d’un slice se fait généralement par une opération de slicing décalé :

slice = slice[1:]

Cette opération s’effectue en temps constant, car elle ne copie pas les éléments, mais modifie simplement les pointeurs et la longueur du slice.

Cependant, si vous souhaitez conserver le tableau d’origine et éviter l’accumulation de mémoire inutilisée, vous pouvez utiliser un tampon circulaire (ring buffer) ou une file d’attente implémentée à partir d’un slice avec deux indices (début et fin). Cela permettra de supprimer efficacement le premier élément en O(1), sans décaler les autres éléments.

Exemple de tampon circulaire :

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
}

Ainsi, pour supprimer le premier élément en temps constant, il est préférable d’utiliser une structure de données qui supporte cette opération, plutôt qu’un slice directement.