Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
55
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

20. Абстрактные типы данных (массивы, связанные списки, выделение памяти)

    1. Абстрактные типы данных

Удобно описывать алгоритмы и структуры данных в терминах выполняемых над ними операций вместо того, чтобы вдаваться в детали какой-либо либо конкретной разработки. Когда структура данных определяется подобным образом, то ее называют абстрактным типом данных. Основной идеей определения таких типов данных является разделить «концепцию» того, чем данная структура данных должна заниматься, от какой-либо ее реализации.

Главная характерная черта абстрактного типа данных – это то, что нечто расположенное «снаружи» от определения этой структуры, равно как и алгоритмы, использующие ее, могут использовать эту структуру только через процедуры и функции над ней определенные, и никаким другим образом. Основная мотивация для разработки абстрактных типов данных – это то, что они весьма облегчают работу при создании больших программ. Они дают нам способ ограничения размера и сложности интерфейса между (возможно сложным) алгоритмом и связанной с ним структурой данных, а также, возможно большим количеством программами, которые используют этот алгоритм и структуру данных. Это облегчает понимание больших программ, и делает более удобным процесс изменения и улучшения основных алгоритмов.

Стеки и очереди являются классическими примерами абстрактных типов данных: большинство программ должны знать лишь о нескольких операциях определенных над ними, а не вдаваться в подробности связанные с индексами и указателями.

Массивы и связанные списки могут в свою очередь быть представлены как разновидности одного и того же абстрактного типа данных – линейного списка. Каждый из них поддерживает операции вставки,удаленияипроизвольного доступа до элемента. Этих операций вполне достаточно для описания алгоритма, и линейные списки довольно полезны на начальных этапах разработки алгоритма. Но программист должен осторожно выбирать используемые операции, потому, что у разных реализаций может быть довольно разное быстродействие. Например, использование связанных списков вместо массивов для решета Эратосфена ухудшило бы производительность потому, что эффективность алгоритма зависит от того, насколько быстро программа может получить доступ до того или иного элемента. С другой стороны, использование массива для решения проблемы Джозефа ухудшит программу потому, что скорость алгоритма зависит от того, насколько быстро удаляется элемент1.

Абстрактный тип данных отделяет алгоритм от конкретных структур данных. Так алгоритм, работающий со стеком «знает» о нем только то, что для него определены операции: положить в стек, взять из стека и проверить стек на пустоту. В то же время для реализации стека может быть использован массив или список. На описании алгоритма это абсолютно не сказывается.

Можно заметить, что один и тот же способ организации данных может выступать и как абстрактный тип и как структура данных. Например, с точки зрения алгоритма сортировки списка, список является абстрактным типом данных, при этом базовой структурой может быть массив или указатель. С другой стороны, алгоритм обработки стека считает стек абстрактным типом данных, а стек в свою очередь может быть реализован с помощью списка, который в этом случае уже будет структурой данных.