Що таке "вхідні дані" та "вихідні дані" алгоритму?
Коротка відповідь
Вхідні дані алгоритму - це значення/структури, які алгоритм приймає на вхід і над якими виконує операції. Вихідні дані - це результат роботи алгоритму, який повертається після обробки входу. Формально алгоритм реалізує відображення 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)
// Алгоритм: порахувати середнє по масиву чисел з валідацією входу.
// Вхід: 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-запит).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.