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

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

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

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

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


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

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

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

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

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

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

Посещение каждого элемента

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

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

Сложить все элементы

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

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

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

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

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

Посчитать совпадения

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

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