Сортировка, поиск и интуиция Big-O
Почему одна и та же задача мгновенна на десяти элементах и зависает на десяти миллионах
- реализовать линейный поиск и двоичный поиск и сказать, когда каждый применим,
- написать сортировку пузырьком и сортировку вставками и сравнить их со встроенной сортировкой Python,
- читать классы
O(1),O(n),O(n log n)иO(n^2), - использовать
timeit, чтобы превратить теорию в измеренные числа, - выбирать подходящий инструмент, рассуждая о росте, а не наугад.
1. Почему важен именно размер входных данных
Любой код быстр на крошечном списке. Интересно то, что происходит, когда вход растёт до тысяч или миллионов элементов. Мы измеряем алгоритм не в секундах (они зависят от вашего процессора), а в числе базовых шагов, которые он выполняет как функцию от размера входа, обозначаемого n.
Если удвоение n примерно удваивает число шагов, рост линейный. Если удвоение n увеличивает шаги вчетверо, рост квадратичный и накажет вас на масштабе. Big-O оставляет только доминирующее слагаемое и отбрасывает константы, потому что на больших n именно доминирующее слагаемое решает всё.