Большое-О простыми словами: почему один код быстрее другого
O(n), O(n²), O(log n) — за этими значками прячется одна простая идея: как растёт время работы, когда данных становится больше. Объясняем без формул.
«Большое-О» звучит как высшая математика, но идея за ним — бытовая: насколько хуже станет, если данных будет в десять раз больше.
Главный вопрос
Big O не отвечает «сколько секунд работает код». Он отвечает на другое: как растёт время, когда растёт размер входа. Это важнее, потому что данные имеют свойство расти.
O(n) — линейно
Прошли по списку один раз: вдвое больше элементов — вдвое больше работы.
def find_max(nums):
best = nums[0]
for n in nums: # n шагов
if n > best:
best = n
return best
O(n²) — квадратично
Цикл внутри цикла. Вдвое больше данных — вчетверо больше работы. На больших объёмах — боль.
def has_duplicate(nums):
for i in range(len(nums)): # n
for j in range(i + 1, len(nums)): # ещё n
if nums[i] == nums[j]:
return True
return False
O(log n) — логарифмически
Каждый шаг выбрасывает половину данных, как в поиске слова в словаре. Миллион элементов — около двадцати шагов. Это очень быстро.
Зачем это вам
На собеседовании и в реальном коде вопрос «а что будет на миллионе записей?» решает Big O. Научитесь видеть вложенные циклы — и половина оптимизаций станет очевидной.