Открыть сервис

Абстрактный тип данных

Абстрактный тип данных (АТД, англ. Abstract Data Type, ADT) — это математическая модель, описывающая множество значений (носитель) и набор операций, которые можно выполнять над этими значениями, без указания конкретного способа их реализации. АТД задаёт интерфейс (контракт) между пользователем и реализацией: пользователь знает, какие операции доступны и каким должно быть их поведение, но не знает, как эти операции устроены внутри. Это ключевое понятие в программировании и теории алгоритмов, позволяющее отделить логику использования данных от деталей их хранения и обработки.

История и происхождение

Понятие абстрактного типа данных восходит к работам по формальным методам и теории типов в 1960-х — 1970-х годах. Термин получил широкое распространение после выхода в 1974 году книги «Структуры данных и алгоритмы» Альфреда Ахо, Джона Хопкрофта и Джеффри Ульмана, а также благодаря работам Барбары Лисков, которая в 1974 году ввела понятие «абстракция данных» в контексте языков программирования. Развитие АТД тесно связано с появлением объектно-ориентированного программирования (ООП), где классы реализуют принцип инкапсуляции, скрывая внутреннее устройство за публичным интерфейсом. Однако АТД — более фундаментальное понятие, не обязательно привязанное к ООП; оно может быть реализовано в любом языке программирования, поддерживающем модульность и сокрытие информации.

Основные характеристики

АТД характеризуется тремя основными аспектами:

Классификация абстрактных типов данных

АТД делятся на несколько категорий по характеру хранимых данных и операций над ними.

Контейнерные типы (коллекции)

Эти АТД хранят набор элементов и предоставляют операции добавления, удаления и доступа. Основные виды:

Древовидные и графовые структуры

Другие распространённые АТД

Реализация абстрактных типов данных

Одна и та же спецификация может быть реализована множеством способов. Выбор реализации влияет на производительность (временную сложность операций) и потребление памяти. Ниже приведены типичные реализации для некоторых АТД.

АТДТипичные реализацииВременная сложность основных операций
СтекМассив (с динамическим расширением), односвязный списокpush/pop: O(1)
ОчередьКольцевой буфер (массив), односвязный список с указателями на голову и хвостenqueue/dequeue: O(1)
СловарьХеш-таблица, сбалансированное дерево (например, красно-чёрное)Вставка/поиск/удаление: O(1) среднее для хеш-таблицы, O(log n) для дерева
МножествоХеш-таблица, бинарное дерево поискаАналогично словарю
СписокМассив (с динамическим расширением), односвязный/двусвязный списокДоступ по индексу: O(1) для массива, O(n) для списка; вставка/удаление в середине: O(n) для массива, O(1) для списка (при наличии ссылки на узел)

Применение в программировании

АТД широко используются при разработке программного обеспечения:

Абстрактные типы данных и объектно-ориентированное программирование

Хотя АТД и ООП тесно связаны, они не тождественны. В ООП класс объединяет данные и методы, работающие с ними, и поддерживает наследование, полиморфизм и инкапсуляцию. АТД — это более узкое понятие, фокусирующееся на спецификации операций. В языках, не поддерживающих ООП (например, C), АТД реализуются через модули и скрытые структуры (например, с помощью typedef и функций, работающих с указателями на скрытые структуры). В языках с поддержкой ООП классы часто выступают естественным средством реализации АТД, но не каждый класс является АТД — класс может нарушать инкапсуляцию, предоставляя прямой доступ к полям.

Пример спецификации абстрактного типа данных (стек)

Спецификация стека на псевдокоде с использованием аксиом: ``` Тип Stack[Element] Операции: create() -> Stack push(Stack, Element) -> Stack pop(Stack) -> Stack | Error top(Stack) -> Element | Error isEmpty(Stack) -> Boolean

Аксиомы: isEmpty(create()) = true isEmpty(push(s, e)) = false top(push(s, e)) = e pop(push(s, e)) = s pop(create()) = Error top(create()) = Error `` Здесь create возвращает пустой стек, push добавляет элемент на вершину, pop удаляет вершину (возвращает ошибку при попытке удалить из пустого стека), top возвращает элемент на вершине, isEmpty` проверяет пустоту.

Критика и ограничения

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →