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

Один проход по данным

O(n) означает линейное время: объём работы растёт вместе с размером входных данных. Вдвое больше элементов — вдвое больше шагов.

В Go линейное время обычно выглядит как один цикл for по срезу или по map. Любой алгоритм, которому нужно хотя бы посмотреть на каждый элемент — суммирование, подсчёт, поиск в неотсортированном срезе, — не может быть быстрее, чем O(n).

Линейное время — хорошая сложность. Миллионы элементов не проблема для одного прохода.


Линейный поиск

Если срез не отсортирован, единственный способ найти значение — проверять элементы по очереди, начиная с первого. Это линейный поиск.

В худшем случае — значение стоит последним или его вообще нет — цикл посетит все n элементов. Именно этот худший случай и описывает O(n).

Найти значение и его позицию

Цикл проверяет "one", "two", "three", прежде чем дойти до "four" — 4 шага для совпадения по индексу 3. break останавливает цикл, как только значение найдено.

Prompt
Напиши программу на Go, которая ищет слово four в срезе one, two, three, four, five с помощью обычного цикла, считая шаги. Когда слово найдено, выведи индекс и число шагов, затем останови цикл с помощью break.
Вывод: программа на Go и захваченный вывод
Find a value and its position

Обход каждого элемента

Многие повседневные задачи — это один проход по всему срезу: сложить все значения, запомнить наибольшее из встреченных, посчитать элементы, проходящие проверку. Каждый элемент затрагивается ровно один раз, поэтому все они O(n).

Два или три таких прохода подряд — всё ещё линейное время: O(2n) и O(3n) сводятся к O(n).

Сумма всех элементов

Цикл добавляет каждый элемент к sum. 8 элементов, 8 сложений — классический вид одного прохода.

Prompt
Напиши программу на Go, которая суммирует срез 3, 1, 4, 1, 5, 9, 2, 6 одним циклом и выводит, сколько элементов она просуммировала, и итоговую сумму.
Вывод: программа на Go и захваченный вывод
Sum all elements

Найти наибольшее значение

max вначале равен первому элементу; каждый следующий элемент, который больше, заменяет его. После одного прохода остаётся наибольшее значение — 9.

Prompt
Напиши программу на Go, которая находит наибольшее значение в срезе 3, 1, 4, 1, 5, 9, 2, 6 за один проход: начни с первого элемента как максимума и заменяй его всякий раз, когда встречается большее. Выведи наибольшее значение.
Вывод: программа на Go и захваченный вывод
Find the biggest value

Подсчёт совпадений

Цикл проверяет каждое слово условием len(w) > 3 и считает подходящие. Три слова длиннее 3 букв.

Prompt
Напиши программу на Go, которая считает, сколько слов в срезе one, two, three, four, five длиннее 3 букв, а затем выводит это количество в виде предложения.
Вывод: программа на Go и захваченный вывод
Count the matches