Какова временная сложность доступа к элементу среза (slice) по индексу?

Ответ

Доступ к элементу среза (slice) по индексу имеет константную временную сложность O(1).

Объяснение

Срез в Go — это легковесная структура, содержащая указатель на базовый массив, длину и ёмкость. Благодаря этому, для доступа к элементу по индексу не требуется перебор. Адрес элемента вычисляется напрямую по формуле:
address = start_address_of_array + index * size_of_element

Эта операция занимает одинаковое время независимо от размера среза.

s := []int{10, 20, 30, 40, 50}

// Прямой доступ к элементу с индексом 2
// Эта операция имеет сложность O(1)
val := s[2] // val будет равен 30

Ключевые моменты

  • Паника при выходе за границы: Попытка доступа к элементу по индексу, который больше или равен длине среза (index >= len(s)), вызовет панику runtime error: index out of range.
  • Паника при nil срезе: Обращение по любому индексу к неинициализированному (nil) срезу также приведет к панике.