Какая асимптотическая сложность у операций со Slice

«Какая асимптотическая сложность у операций со Slice» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Операции со слайсами в Go имеют разную сложность:

  • Доступ по индексу (slice[i]): O(1) – константное время
  • Добавление (append):
    • O(1) – если есть место в capacity
    • O(n) – при реаллокации (копирование всех элементов)
  • Копирование (copy): O(n) – линейное время
  • Срез (slice[a:b]): O(1) – создает новый заголовок слайса
  • Итерирование (range): O(n) – зависит от длины слайса

Пример с append:

s := make([]int, 0, 3) // O(1)
s = append(s, 1)       // O(1) – есть capacity
s = append(s, 2, 3, 4) // O(n) – реаллокация

При работе со слайсами важно учитывать возможные реаллокации при append, которые могут существенно повлиять на производительность.