Skip to main content

Що таке "вхідні дані" та "вихідні дані" алгоритму?

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

Вхідні дані алгоритму - це значення/структури, які алгоритм приймає на вхід і над якими виконує операції. Вихідні дані - це результат роботи алгоритму, який повертається після обробки входу. Формально алгоритм реалізує відображення f: X → Y, де X - множина допустимих входів (домен), а Y - множина можливих виходів (кодомен), іноді з урахуванням помилок: f: X → Y ∪ E.

Докладний розбір

Визначення

  • Вхідні дані (input): значення, параметри, структури або потоки, які подаються алгоритму для обробки.
  • Вихідні дані (output): результат обчислень - значення, структура, потік або сигнал (включно з помилкою), які алгоритм повертає назовні.

Ключові властивості та вимоги

  • Домен і валідність: які значення вважаються допустимими входами (типи, діапазони, формат). Алгоритм повинен вміти валідувати вхід і коректно обробляти недопустимі випадки.
  • Детермінованість: для детермінованих алгоритмів однаковий вхід ⇒ однаковий вихід. Для недетермінованих вихід може залежати від випадковості/оточення.
  • Явність форматів: чіткі контракти входу/виходу (типи, одиниці виміру, кодування, локаль, сортування, пагінація тощо).
  • Помилки як частина виходу: помилки - це теж форма виходу (виняток, код статусу, Result<T, E>), навіть якщо вони сигналізують про неможливість отримати основний результат.
  • Відокремлення побічних ефектів: логування, запис у БД, надсилання листів - це не "вихідні дані", а побічні ефекти. Вихід - це те, що повертається як результат обчислення.

Типи входів/виходів (на практиці)

  • Скалярні: числа, рядки, булеві значення, дати/таймстемпи.
  • Структуровані: об'єкти/словники, записи, JSON.
  • Колекції: масиви, списки, множини, карти.
  • Потоки: байтові потоки, ітератори, реактивні потоки (Observable).
  • Сигнали стану: коди статусу, прапорці успіху/помилки, винятки, Result<E, T>.

Приклади з розробки

  • Сортування масиву: вхід - масив чисел/рядків, вихід - відсортований масив (тієї ж довжини).
  • Логін: вхід - email/логін і пароль; вихід - токен/сесія або помилка авторизації.
  • REST-ендпоінт GET /users?limit=10&offset=20: вхід - query-параметри; вихід - JSON-список користувачів і метадані пагінації або помилка 4xx/5xx.
  • Хеш-функція: вхід - байтовий рядок; вихід - фіксований хеш-рядок.

Формалізація

Алгоритм можна розглядати як функцію f: X → Y, де X - множина допустимих входів, Y - множина виходів. На практиці часто корисно явно враховувати помилки: f: X → Y ∪ E, або використовувати типи на кшталт Result<Y, E>. Якщо частина входів не підтримується, то f є частковою: визначена не на всій X, і це має бути відображено в контракті.

Межі та крайні випадки

  • Порожні входи: порожній масив, порожній рядок - що повертати? Часто - нейтральний елемент або помилка залежно від задачі.
  • Невалідні значення: null/undefined/NaN, невірний формат, неправильне кодування.
  • Переповнення/протікаючі типи: великі числа, довгі рядки, великі файли.
  • Недетермінізм: залежність від часу, випадковості, мережі - фіксуйте це в контракті (зерна RNG, таймаути, повтори).

Приклад коду (JavaScript)

javascript
// Алгоритм: порахувати середнє по масиву чисел з валідацією входу. // Вхід: numbers: unknown // Вихід: об'єкт-результат { ok: boolean, value?: number, error?: string, meta?: object } function safeAverage(numbers) { if (!Array.isArray(numbers)) { return { ok: false, error: 'numbers must be an array' }; // помилка як вихід } const filtered = numbers.filter(n => typeof n === 'number' && Number.isFinite(n)); if (filtered.length === 0) { return { ok: false, error: 'no valid numbers' }; } const sum = filtered.reduce((a, b) => a + b, 0); const avg = sum / filtered.length; return { ok: true, value: avg, meta: { count: filtered.length } }; // основний вихід } // Приклади використання: // Вхід: [1, 2, 3] // Вихід: // { ok: true, value: 2, meta: { count: 3 } } // Вхід: ['a', Infinity] // Вихід: // { ok: false, error: 'no valid numbers' } // Додатково: парсинг query-рядка (ще один алгоритм) function parseQuery(qs) { const params = new URLSearchParams(qs.startsWith('?') ? qs.slice(1) : qs); const result = {}; for (const [k, v] of params) { if (k in result) result[k] = Array.isArray(result[k]) ? result[k].concat(v) : [result[k], v]; else result[k] = v; } return result; } // Вхід: '?q=test&tags=js&tags=algo' // Вихід: { q: 'test', tags: ['js', 'algo'] }

Як коротко відповідати на співбесіді

  • Дати визначення: "Вхід - це те, що алгоритм приймає, вихід - те, що він повертає; алгоритм - відображення f: X → Y".
  • Додати про помилки: "Помилки - це теж різновид виходу (наприклад, виняток або Result<E, T>)".
  • Навести 1-2 практичні приклади з веб-розробки (логін, сортування, REST-запит).

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

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

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