Масив (структура даних)

Маси́в — впорядкований набір фіксованої кількості однотипних елементів, що зберігаються в послідовно розташованих комірках оперативної пам'яті, мають порядковий номер і спільне ім'я, що надає користувач.

Характеристика масиву

ред.
  • Розмірність — кількість індексів елемента (одномірний, двовимірний, …, багатовимірний)
  • Розмір — загальна кількість елементів у масиві.
  • Масиви можуть бути числові, символьні й інших типів.
  • У кожній мові є свої правила опису масивів (у мові Бейсик — командою DIM <список масивів>]]).

У програмуванні масив (англ. array) — сукупність елементів одного типу даних, впорядкованих за індексами, які зазвичай репрезентовані натуральними числами, що визначають положення елемента в масиві.

Масив може бути одномірним (вектором), та багатовимірним (наприклад, таблицею), тобто таким, де індексом є не одне число, а кортеж (сукупність) з декількох чисел, кількість яких збігається з розмірністю масиву.

У більшості мов програмування масив є стандартною вбудованою структурою даних.

Переваги та недоліки

ред.

Ефективність операцій

ред.

Масиви ефективні при звертанні до довільного елементу, яке відбувається за постійний час (O(1)), однак такі операції як додавання та видалення елементу, потребують часу O(n), де n — розмір масиву. Тому масиви переважно використовуються для зберігання даних, до елементів яких відбувається довільний доступ без додавання або видалення нових елементів, тоді як для алгоритмів з інтенсивними операціями додавання та видалення, ефективнішими є зв'язані списки.

Збереження в пам'яті

ред.

Інша перевага масивів, яка є досить важливою — це можливість компактного збереження послідовності їхніх елементів у локальній області пам'яті (що не завжди вдається, наприклад, для зв'язаних списків), що дозволяє ефективно виконувати операції з послідовного обходу елементів таких масивів.

Масив є дуже економною щодо пам'яті структурою даних. Для збереження 100 цілих чисел у масиві необхідно рівно в 100 разів більше пам'яті, ніж для збереження одного числа (плюс, можливо, ще декілька байтів). Водночас, усі структури даних, які базуються на вказівниках, потребують додаткової пам'яті для збереження самих вказівників разом з даними. Однак, операції з фіксованими масивами ускладнюються тоді, коли виникає необхідність додавання нових елементів у вже заповнений масив. Тоді його необхідно розширювати, що не завжди можливо і для таких задач слід використовувати зв'язані списки, або динамічні масиви.

Індекси в масивах

ред.

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

З тієї причини, що масиви мають фіксовану довжину, слід дуже обережно ставитися до процедури звертання до елементів за їхнім індексом, тому що намагання звернутися до елемента, індекс якого перевищує розмір такого масива (наприклад, до елемента з індексом 6 у масиві з 5 елементів), може призвести до непередбачуваних наслідків.

Слід також бути уважним щодо принципів нумерації елементів масиву, яка в одних мовах програмування може починатись з 0, а в інших — з 1.

Зберігання багатовимірних масивів

ред.

Збереження одновимірного масиву в пам'яті є тривіальним, тому що сама пам'ять комп'ютера є одновимірним масивом. Для збереження багатовимірного масиву ситуація ускладнюється. Припустимо, що ми хочемо зберігати двовимірний масив такого вигляду:

 

Найпоширеніші способи його організації в пам'яті такі:

  • Розташування «рядок за рядком». Це найуживаніший на сьогодні спосіб, який зустрічається в більшості мов програмування.
1 2 3 4 5 6 7 8 9
  • Розташування «стовпчик за стовпчиком». Такий метод розташування масивів використовується, зокрема, у мові програмування Fortran
1 4 7 2 5 8 3 6 9
  • Масив з масивів. Багатовимірні масиви репрезентуються одновимірними масивами вказівників на одновимірні масиви. Розташування може бути як «рядок за рядком» так і «стовпчик за стовпчиком».
 

Перші два способи дозволяють розміщувати дані компактніше (мають більшу локальність), однак це одночасно і обмеження: такі масиви мають бути «прямокутними», тобто кожний рядок повинен містити однакову кількість елементів. Розташування «масив з масивів», з іншого боку, не дуже ефективне щодо використання пам'яті (необхідно зберігати додатково інформацію про вказівники), але знімає обмеження на «прямокутність» масиву.

Див. також

ред.

Джерела

ред.
  • Дональд Кнут. Sorting and Searching // The Art of Computer Programming. — Massachusetts : Addison–Wesley, 1998. — Т. 3. — 780 с. — ISBN 0-201-89685-0.(англ.)
  • Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2009) [1990]. 2 Загальні засади. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN 0-262-03384-4.