Sobes.tech
Junior — Middle

Jak skutecznie usunąć element z zakresu bez zachowania kolejności elementów, nie przekraczając stałej złożoności operacji?

sobes.tech AI

Odpowiedź od AI

Aby usunąć element z zakresu (slice) w Go bez zachowania kolejności elementów i przy operacji o stałej złożoności O(1), można zamienić usuwany element z ostatnim elementem zakresu, a następnie skrócić zakres o jeden.

Przykład:

func removeUnordered(s []int, i int) []int {
    s[i] = s[len(s)-1] // zamienia element i z ostatnim
    return s[:len(s)-1] // skraca zakres
}

// Użycie:
s := []int{10, 20, 30, 40, 50}
s = removeUnordered(s, 1) // usuwa element o indeksie 1 (20)
// Teraz s może być na przykład [10, 50, 30, 40]

Ten sposób nie zachowuje kolejności elementów, ale działa bardzo szybko, ponieważ nie wymaga przesuwania elementów.