Skip to main content

Розмір вхідних даних

1. Основна ідея

Чим більше вхідних даних, тим довше виконується код, якщо алгоритм не масштабується ефективно.

Розмір вхідних даних напряму впливає на:

  • час виконання (навантаження на CPU);
  • використання пам'яті;
  • кількість операцій вводу/виводу (I/O);
  • кількість ітерацій і глибину рекурсії.

Зазвичай залежність виражають через асимптотичну складність (Big O) - як швидко зростає час виконання при збільшенні вхідних даних.


2. Проста візуалізація

АлгоритмСкладністьЩо означаєПриклад
O(1)константнане залежить від розміру данихдоступ за індексом arr[0]
O(log n)логарифмічназростає повільнобінарний пошук
O(n)лінійначас зростає пропорційно кількості елементівцикл for по масиву
O(n log n)квазілінійнапомірне зростанняArray.sort()
O(n²)квадратичнавибухове зростання при великих данихвкладені цикли
O(2ⁿ)експоненційназростає катастрофічнорекурсивний Fibonacci
O(n!)факторіальнанеможлива для великих nперестановки

3. Приклади на JavaScript

O(1) - не залежить від розміру

javascript
const arr = [1, 2, 3, 4, 5]; console.log(arr[3]); // миттєво, хоч 5, хоч 5 млн елементів

O(n) - лінійна залежність

javascript
function sum(arr) { return arr.reduce((acc, num) => acc + num, 0); } sum([1, 2, 3]); // ~3 операції sum(new Array(1000000)); // ~1 000 000 операцій

Чим більший масив, тим більше часу.


O(n²) - квадратичне зростання

javascript
function allPairs(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length; j++) { // якась операція } } }

Якщо n = 1000, то операцій ~ 1 000 000. Якщо n = 10 000, то вже 100 000 000.


O(2ⁿ) - експоненційне зростання

javascript
function fib(n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2); } fib(30); // ок fib(45); // вже гальмує!

Зростання вибухове. При 100 елементах порахувати просто неможливо.


4. Як зростання вхідних даних впливає на продуктивність

Розмір вхідних данихO(1)O(log n)O(n)O(n²)O(2ⁿ)
10швидкошвидкошвидкошвидкошвидко
100швидкошвидкошвидкопомірноповільно
1 000швидкошвидкопомірноповільнокритично
100 000швидкошвидкоповільнокритичнокритично

Висновок: при маленьких даних усе "летить", але при зростанні обсягу "неефективний" код починає вибухати за часом.


5. Продуктивність у різних сценаріях

Тип задачіПрикладЯк впливає розмір даних
Перебір масивуmap, filter, reduceлінійно
Пошук у масивіarr.includes()лінійно
Пошук в об'єкті / Mapobj[key], map.get()майже O(1)
Сортуванняarr.sort()O(n log n)
Порівняння вкладених структурглибоке порівняння об'єктівможе бути O(n²)
Рендеринг у Reactвеликі списки, таблицічас зростає з обсягом DOM
Запити до БДбез індексу -> O(n)чим більше рядків, тим повільніше

6. Практичні наслідки

  • навантаження на CPU зростає - операції тривають довше;
  • пам'ять збільшується - особливо при копіюванні або зберіганні великих структур;
  • event loop блокується - інтерфейс "підвисає";
  • FPS падає - анімації стають нерівними;
  • GC (збирач сміття) працює частіше -> лаги.

7. Як покращити продуктивність при зростанні даних

ПроблемаРішення
Цикли занадто довгіРозбити на чанки (setTimeout, requestIdleCallback)
Складні фільтри/пошукиВикористовувати Set, Map, індекси
Часті повторні обчисленняМемоізація
Багато елементів у DOMВіртуалізація (react-window, infinite scroll)
Часте перестворення масивівВикористовувати мутації з обережністю
Великі JSONПотокове читання (ReadableStream)

Резюме

Чим більший розмір вхідних даних, тим сильніше проявляється асимптотична складність алгоритму і навантаження на пам'ять/CPU.

Розмір даних вгору-> Впливає на
Кількість ітераційЧас виконання
Глибина рекурсіїРизик переповнення стека
Кількість об'єктівВикористання пам'яті
Довжина списку / масивуКількість перемальовувань (у React)
Обсяг I/OЗатримка через мережу / диск

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.