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

Классификация структур данных

По методу адресации и методу доступа структуры данных можно разделить на классы:

I)последовательная структураданных, при этом адресация и доступ последовательны;

Рассмотрим различные случаи:

а) длины элементов одинаковы;

Если длины элементов одинаковы, то такая структура может рассматриваться как массив:

Адрес Аn = длина * (n-1) + Адрес А1

Этот случай не представляет интереса, т.к. он используется в массивах. Поэтому будем считать, что в последовательной СД длины элементов могут быть разными. Возникает проблема отделения одного элемента от другого.

б) метод разделителей;

Выбираем какой-то элемент, не принадлежащий данным, хранящимся в структуре, в качестве разделителя. Например, символ (*).

А1 * А2 * А3 * ... Аn \

Признак конца

Следствием этой организации служит то, что мы можем двигаться по такой структуре только на длину этого символа-разделителя (иначе мы можем перескочить через границу между элементами). Это очень негибкая и неэффективная реализация. Большие потери по времени обработки и по памяти за счет хранения символа разделителя. Кроме того сужается множество допустимых элементов, которые могут храниться в теле структуры данных.

в) вычисляемый доступ;

Обработку можно ускорить, если в качестве разделителя взять длину элемента с фиксированным расположением в поле элемента (например, в начале элемента структуры).

L1 А1 L2 А2 ... Ln Аn \

В этом случае

Адрес Аn = СУММА Li + Адрес А1

Такой метод доступа принято называть вычисляемым.

г)вычисляемый доступ с вынесенным дескриптором: все длины собирают отдельно от самих элементов;

Как видим, длина элемента в этом случае выступает в качестве дескриптора элемента (носит чисто служебный характер). Можно все длины собрать вместе и получить дескриптор всей структуры. В этом случае дескриптор и тело можно хранить отдельно друг от друга.

L1 L2 ... Ln

А1 А2 ... Аn

Наряду с длинами можно хранить и другие характеристики элементов, например, их теги ("ярлычки"), описывающие тип хранимой в элементе информации. Все общие характеристики элементов структуры можно не дублировать в каждом элементе, а иметь идин на всю структуру и хранить в дескрипторе структуры. Этим можно добиться существенной экономии памяти.

д) базированный метод доступа: хранятся не просто длины, а накопленные длины;

Давайте будем хранить не длины элементов, а накопленные длины:

0 L1 L1+L2 ... СУММА Li

S1 S2 S3 ... Sn

А1 А2 ... Аn

где Sk - это смещение k-ого элемента структуры относительно начала.

Этот метод доступа принято называть базированным методом доступа. При такой организации добавление и удаление элементов еще более усложняется (придется переделывать дескриптор).

Кроме того может возрасти длина дескриптора (накопленные длины будут большими числами, чем длины отдельных элементов). Например, если длины элементов не превышают 256, то суммарная длина может оказаться больше 256 и одним байтом уже не обойтись.

Вынесение дескрипторов элементов в один дескриптор структуры имеет еще один недостаток, а именно, при потере дескриптора возможна потеря всей информации, хранящейся в структуре.

е) координатный прямой доступ: в качестве элементов в дескрипторе хранятся абсолютные адреса.

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

ВЫВОД: Последовательная структура является существенно статической структурой со сложной реорганизацией.

II) Массив - это структура данных с последовательным расположением элементов и вычисляемым доступом по индексам. Т.к. надо уметь вычислять адрес элемента по индексам, то предполагается, что все элементы массива имеют одинаковую длину.

а) одномерный массив (вектор).

Адрес Аi = Адрес А1 + (i-1)*L,

где L - длина элемента.

б) двумерный массив (матрица)

Hеобходимо выбрать расположение двумерного массива в линейной памяти (по строкам, по столбцам или каким-нибудь другим способом).

Hапример, элементы массива располагаются в памяти по строкам. В этом случае для матрицы А = (nxm) имеем

Адрес Аi,j = Адрес А1 + (i-1)*m*L + (j-1)*L = [(i-1)*m+(j-1)]*L

Величину k = (i-1)*m+(j-1) + 1 называют приведенным индексом, т.е.

Адрес Аi,j = Адрес А1 + (k-1)*L

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

в) трехмерный массив можно представить состоящим из слоев двумерного. Опять можно получить формулу для приведенного индекса и решать задачи расположения и выборки элементов из линейной памяти.

Итак, массив - это набор однотипных элементов, расположенных в памяти подряд и доступ к которым осуществляется по индексам, не хранящимся вместе с элементами данных.

Для массива удобно выполнять операции доступа, но очень неудобно выполнять операции добавления и удаления элементов. Поэтому можно сделать вывод, что массив - это существенно статическая структура, тяжело поддающаяся реорганизации.

Массивы, как правило, имеют встроенную реализацию в языках программирования. Hо эти реализации в разных системах программирования могут существенно отличаться. Рассмотрим такие типичные реализации.

а) Языки FORTRAN и PASCAL предоставляют пользователю многомерные статические массивы. Память под такие массивы выделяется раз в начале работы программы и размер массива не может меняться в процессе выполнения программы.

б) Язык ALGOL 60 предоставляет пользователю так называемые динамические массивы. Они характеризуются тем, что размерность (размерности) массива может быть вычислена в охватывающем блоке и передана во внутренний блок как параметр (или как глобальная переменная) и память необходимого размера будет выделена при входе в блок. Поддержка таких массивов требует от системы программирования поддерживать динамическое управление памятью, что усложняет реализацию и вызывает дополнительные расходы процессорного временит на этапе выполнения.

в) Язык CLU предоставляет пользователю одномерные массивы с подвижными границами. Верхняя и нижняя границы массива могут меняться динамически в процессе выполнения программы с помощью специальных операций:

операции addl и addh - увеличивают массив в сторону младших/старших индексов;

операции reml и remh - соответственно укорачивают массив.

Рассходы системы программирования на поддержку работы с такими массивами еще более значительны.

III) Если в структуре часто приходится удалять\добавлять элементы, то целесообразно использовать списковые структуры. Это структура с последовательной обработкой и произвольным размещением.

Список состоит из элементов (узлов списка), образующих некоторую последовательность. Каждый узел явно указывает своего последователя. В каждом узле должна находиться информация об элементе данных (или ссылка на нее).

L -----------

А1 ---- А2 ---- ... ---- Аn /

В последнем элементе находится ссылка в никуда (nil) - признак конца списка.

Если порядок расположения элементов в списке совпадает с порядком их размещения, то указатели можно опустить и список вырождается в последовательную структуру. Такие структуры часто называют несвязанным списком, а общую списковую структуру - связанным списком.

Примеры представления списков

L --- Beg Fin

2 ---- 10 ---- ... ---- 1 /

1. Иванов

2. Петров

...

10. Сидоров

Рис 1. Пример списка с дескриптором, хранящим указатели на первый и

последний элементы, и элементами, хранящимися в линейном массиве.

В зависимости от количества и ориентации указателей различают:

- линейные однонаправленные списки;

- линейные двунаправленные списки;

- кольцевые однонаправленные списки;

- кольцевые двунаправленные списки;

- многоуровневые списки (язык LISP);

П - роизвольные (многосвязные) списки (сети).

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

IY) Табличные структуры.

Здесь порядок обработки и расположения элементов не регламентированы (являются произвольными). При этом доступ к элементу таблицы осуществляется по его значению (ключу), который, как правило, должен быть частью элемента таблицы. Место расположения элемента определяется или с помощью специальной функции Адрес = f(k), преобразующей значение ключа в адрес (такая функция называется функцией хеширования или расстановки) или с помощью специальной операции поиска.

Таблицы могут быть реализованы на базе массивов, списков, деревьев и т.д. В зависимости от этого они могут быть динамическими или статическими, линейными или древовидными и т.д.

V) Древовидные СД.

Элемент такой структуры (узел дерева) определяется как запись, содержащая несколько полей ссылок. Например:

 Type Point = ^ Item;

              Item = Record

              Data: Integer;

              Right, Left: Point

   End;

 

 

Type                                                                

        Link = ^ TreeVert;

       TreeVert = Record

       Data: Real;

        Key : Integer;

        Left,  Middle,  Right : Link

End;

Количество ссылочных полей узла дерева называется степенью ветвления (арностью) узла.

Таким образом, дерево может быть либо вырожденным (Nil), либо составлено из узла дерева, все указатели которого выставлены на деревья. В этом случае узел называют корнем дерева, а деревья, на которые выставлены указатели - поддеревьями. Если поддерево состоит из одного узла, все указатели которого установлены на Nil, его называют листом. Остальные узлы дерева называют промежуточными. Совокупность ссылочных полей может быть оформлена как запись либо как несколько полей записи (как в наших примерах). Часто совокупность ссылочных полей определяется в виде массива ссылок, либо организуется в виде списка ссылок. В этих случаях говорят об упорядоченных деревьях, т.к. поддеревья одного корня оказываются упорядоченными либо индексами массива, либо по порядку доступа. Если все узлы дерева имеют одну и ту же степень ветвления, можно говорить о степени ветвления дерева. Деревья, степень ветвления которых равна двум, называют бинарными. Бинарные деревья - одна из наиболее распространенных ветвящихся структур, применяемых в программировании.

V) Сетевые СД.

Сеть - орграф, в котором допускаются и петли, и кратные дуги и который используется как модель системы, процесса и пр. Обычно в сети выделяются некоторые вершины - полюсы сети, играющие роль входов и выходов сети. В теории программирования сеть используется для описания статической топологии моделируемого процесса или системы и имеет вид двудольного орграфа (в общем случае бесконечного) с двумя типами вершин: места и переходы. На основе понятия сети вводятся динамические сетевые структуры, в которых местам приписываются специальные разметки, моделирующие выполнение условий, и с сетью связывается понятие ее функционирования, изменяющего эти разметки (условия) в результате так называемых срабатываний переходов. К таким динамическим сетям относятся сети Петри, их различные варианты, обобщения и частные случаи.

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

В сетевой структуре любой элемент может быть связан с любым другим элементом. Пример сетевой структуры:

1 4 1 2 3

  1. 3

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

При рассмотрении некоторых сетевых структур естественно говорить об уровнях, так же как и в случае древовидных структур. Так в первом и втором примере структуры имеют два и три уровня соответственно.

Лекция 5. Понятие о типе данных в языках программирования

Что есть данные? Одно из определений будет звучать как Данные – изображение информации, то есть описание состояний некоторый среды хранения. Все это можно рассмотреть на примере. Зададим себе вопрос: а что есть формат данных? Допустим у нас некоторое число:

Соседние файлы в папке Программы