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

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

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

Это наилучшая возможная сложность. Типичные операции O(1) в PHP: чтение элемента массива по индексу или по ключу, count(), добавление одного элемента с помощью $arr[] = ... и простая арифметика.

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


Поиск по индексу и по ключу

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

Строковые ключи работают так же: $ages["Ben"] находит значение напрямую, в среднем за постоянное время. С отсутствующим ключом нужна осторожность: простое $ages["Dan"] вызывает предупреждение и даёт null, поэтому безопасное чтение — это $ages["Dan"] ?? null: оператор ?? тихо возвращает значение по умолчанию, когда ключа нет.

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

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

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

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

$ages["Ben"] ?? null находит 25 напрямую. Отсутствующий ключ "Dan" сводится к значению по умолчанию из ?? и даёт NULL — по-прежнему за постоянное время. Без ?? чтение отсутствующего ключа сначала вызвало бы предупреждение.

Prompt
Напишите PHP-скрипт с ассоциативным массивом «имя — возраст», содержащим Ana 30, Ben 25 и Cleo 41. Найдите Ben с запасным значением ?? null и выведите результат. Затем таким же образом найдите отсутствующий ключ Dan и снова выведите результат.
Вывод: PHP-скрипт
Read a value by key

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

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

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

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

$colors[] = "yellow" помещает "yellow" в конец. Стоимость не зависит от того, сколько цветов уже есть в массиве.

Prompt
Напишите PHP-скрипт с массивом, содержащим red, green, blue. Выведите массив и его количество элементов, добавьте yellow с помощью $colors[] = "yellow", затем снова выведите массив и его количество элементов.
Вывод: PHP-скрипт
Append one element

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

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

Prompt
Напишите PHP-скрипт с двумя переменными a = 1 и b = 2. Выведите их, поменяйте местами списочным присваиванием [$a, $b] = [$b, $a] и выведите снова.
Вывод: PHP-скрипт
Swap two values