Перейти к основному содержимому

Один шаг при любом размере

O(1) означает константное время: операция выполняется за одно и то же число шагов, независимо от того, содержит вход 5 элементов или миллион. Объём работы не растёт вообще.

Это лучшая сложность, которая бывает. Типичные операции O(1) в Go: чтение элемента среза по индексу, чтение значения из map по ключу, len(), добавление одного элемента и простая арифметика.

Обратите внимание, чего O(1) не означает: это не значит «быстро», это значит «не становится медленнее при росте входных данных». Один константный шаг всё ещё может быть медленным — но он остаётся одним шагом.


Поиск в срезе и в map

Элемент среза лежит в известном месте памяти, поэтому words[2] — это один переход: компьютер не проходит по элементам, стоящим перед ним. Такое же чтение стоит столько же и в срезе из миллиона элементов.

Поиск в map вида ages["Ben"] тоже в среднем занимает константное время: ключ прямо указывает map, где хранится значение. Поиск возвращает value, ok, и ok равно false, когда ключа нет.

Чтение элемента по индексу

Программа читает один элемент из среза из 5 элементов и один — из среза с миллионом элементов. Оба чтения — это один шаг: длина среза не играет роли.

Prompt
Напиши программу на Go с небольшим срезом из 5 слов и большим срезом из миллиона значений int, созданным с помощью make и цикла. Прочитай по индексу один элемент из каждого и выведи оба, чтобы показать, что чтение по индексу — это один шаг, какой бы длины ни был срез.
Вывод: программа на Go и захваченный вывод
Read an element by index

Чтение значения по ключу

ages["Ben"] находит 25 напрямую. Отсутствующий ключ "Dan" возвращает нулевое значение 0 и ok == false — всё так же за константное время.

Prompt
Напиши программу на Go с map из имён в возраст, содержащей Ana 30, Ben 25 и Cleo 41. Найди Ben и выведи значение и флаг ok. Затем найди отсутствующий ключ Dan и выведи значение и флаг ok.
Вывод: программа на Go и захваченный вывод
Read a value by key

Добавление элемента и простая арифметика

append() добавляет один элемент в конец среза. Чаще всего это один шаг. (Изредка срез приходится увеличивать, и он копируется, но в среднем стоимость одного append остаётся константной.)

Все мелкие операции — присваивания, сложения, сравнения, обмен двух значений — тоже O(1). Это те самые «шаги», в которых считаются все остальные классы сложности.

Добавление одного элемента

append() помещает "жёлтый" в конец. Стоимость не зависит от того, сколько цветов уже есть в срезе.

Prompt
Напиши программу на Go со срезом, содержащим красный, зелёный, синий. Выведи срез и его длину, добавь жёлтый, затем снова выведи срез и его длину.
Вывод: программа на Go и захваченный вывод
Append one element

Обмен двух значений

a, b = b, a меняет местами два значения за один шаг константного времени — вспомогательная переменная не нужна.

Prompt
Напиши программу на Go с двумя переменными a = 1 и b = 2. Выведи их, поменяй их местами с помощью присваивания двух значений a, b = b, a и выведи их снова.
Вывод: программа на Go и захваченный вывод
Swap two values