Sobes.tech
Junior — Middle

Como remover eficazmente o primeiro elemento de um array dinâmico em tempo constante?

sobes.tech IA

Resposta da IA

Em Go, os arrays dinâmicos são representados por slices. A remoção do primeiro elemento de um slice geralmente é feita usando um slicing deslocado:

slice = slice[1:]

Essa operação é realizada em tempo constante, pois não copia os elementos, apenas altera os ponteiros e o comprimento do slice.

No entanto, se desejar manter o array original e evitar o acúmulo de memória não utilizada, pode usar um buffer circular (ring buffer) ou uma fila implementada com um slice e dois índices (início e fim). Isso permitirá remover eficientemente o primeiro elemento em O(1), sem deslocar os demais elementos.

Exemplo 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
}

Portanto, para remover o primeiro elemento em tempo constante, é melhor usar uma estrutura de dados que suporte essa operação, em vez de um slice diretamente.