O(1), так же известно как «константное время». Самый лучший вариант, скорость алгоритма не зависит от количества
🐾 Пример
Вы — счастливый обладатель N котиков. Каждый котик знает, как его зовут. Если позвать «Феликс!», то прибежит только он, а остальным N-1 жопкам пофиг.
🐈 🐈 🐈 🐈 🐈
🐈 🐈⬛ 🐈 🐈 🐈
↓
мяу!
В жизни время выполнения O(1) обычно встречается при работе со срезами и картами.
Срезы
У среза известен адрес в памяти первого элемента и размер каждого элемента. Следовательно, адрес i-го элемента тоже известен
(first + i*size)
— а значит, доступ к i-му элементу выполняется за константное время. Изменение i-го элемента аналогично — тоже O(1).s := make([]int, 1e6)
i := rand.IntN(1e6)
s[i] = 42 // O(1)
fmt.Println(s[i]) // O(1)
С добавлением и удалением элементов сложнее — они рано или поздно приводят к созданию нового массива под срезом — а это уже операция O(n). Но если аккуратно все посчитать, то получится, что в среднем добавление/удаление тоже константные.
Карты
Не вдаваясь в подробности скажу, что за картой тоже скрывается массив. Грубо говоря, когда вы пишете
m["answer"] = 42
, то Go превращает "answer" в целое число (хеш строки), после чего считает по нему нужный индекс в массиве. По этому индексу и находится значение 42.d := map[string]int{}
d["answer"] = 42 // O(1)
fmt.Println(d["answer"]) // O(1)
Поэтому доступ к элементу карты по ключу — тоже O(1).
🐈