Структуры данных по реализации делятся на два вида:
Пример на C++:
int arr[6] {10, 15, 16, 8, 9, 1};
| Операция | Вычислительная сложность |
|---|---|
| Получение по индексу | $O(1)$ |
| Вставка (или удаление) в начало | $O(N)$ |
| Вставка (или удаление) в середину | $O(N)$ |
| Вставка (или удаление) в конец | $O(1)$ — амортизированная |
Для примера рассмотрим связный список из трёх элементов: $21$, $55$, $46$. Логически он выглядит так:
А в памяти может располагаться, например, так:
| Операция | Вычислительная сложность |
|---|---|
| Получение по индексу | $O(N)$ |
| Вставка (или удаление) куда (откуда) угодно, если известен указатель | $O(1)$ |
| Структура | Реализация |
|---|---|
| Динамический массив | std::vector |
| Односвязный список | std::forward_list |
| Двусвязный список | std::list |
| Стек | std::stack |
| Очередь | std::queue |
| Дек | std::deque |