Ответ
Доступ к элементу слайса по индексу имеет константную асимптотическую сложность — O(1).
Почему O(1)?
Слайс в Go — это легковесная структура (дескриптор), которая содержит три поля:
- Указатель на начало базового массива (backing array).
- Длину (
len
). - Ёмкость (
cap
).
Когда вы обращаетесь к элементу s[i]
, Go выполняет простое арифметическое вычисление адреса в памяти: адрес_начала_массива + i * размер_элемента
. Эта операция занимает постоянное время, независимо от размера слайса.
Пример:
s := []int{10, 20, 30, 40, 50}
// Этот доступ занимает одинаковое время,
// независимо от того, 5 элементов в слайсе или 5 миллионов.
val := s[2] // O(1)
Важные аспекты:
- Доступ по индексу vs. Итерация: Не путайте доступ по индексу (O(1)) с итерацией по всему слайсу (
for range s
), сложность которой линейна — O(n). - Выход за границы: Попытка доступа к элементу по индексу
>= len(s)
вызовет panic. - Стоимость роста: Операция
append
в среднем имеет амортизированную сложность O(1), но если ёмкость исчерпана, происходит выделение нового, большего массива и копирование всех элементов, что временно даёт сложность O(n).