Sobes.tech
Junior — Middle

Jak efektivně odstranit prvek ze slice bez zachování pořadí prvků, aniž by se překročila konstantní složitost operace?

sobes.tech AI

Odpověď od AI

Chcete-li odebrat prvek z řezného pole v Go bez zachování pořadí prvků a s operací s konstantní složitostí O(1), můžete nahradit odstraňovaný prvek posledním prvkem řezného pole a poté řezné pole zkrátit o jeden.

Příklad:

func removeUnordered(s []int, i int) []int {
    s[i] = s[len(s)-1] // nahradí prvek i posledním
    return s[:len(s)-1] // zkrátí řezné pole
}

// Použití:
s := []int{10, 20, 30, 40, 50}
s = removeUnordered(s, 1) // odstraní prvek na indexu 1 (20)
// Nyní může být s například [10, 50, 30, 40]

Tato metoda neuchovává pořadí prvků, ale je velmi rychlá, protože nevyžaduje posuny prvků.