Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД ПЗ 01.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
121.34 Кб
Скачать

2. Структуры хранения данных

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

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

В чем же отличие между вектором в структуре данных и в струк­туре хранения? В структуре данных вектор характеризуется фик­сированным числом однотипных элементов, допустимыми значе­ниями элементов, доступ к отдельному элементу осуществляется по его индексу. В структуре хранения для вектора отводится сплош­ная область памяти, достаточная для размещения всех элемен­тов, каждый элемент занимает фиксированный объем памяти, следовательно, и для вектора выделяется фиксированный объем памяти. Доступ к каждому элементу памяти осуществляется по его адресу.

Как отмечалось выше, отображение структуры данных в структуру хранения осуществляется в программе средствами язы­ка программирования. Поэтому программист за одними и теми же описаниями данных в программе видит, с одной стороны, структуру данных, с другой стороны, структуру хранения, ко­торая реализуется только после трансляции программы, при ее выполнении. Это ведет к тому, что в программировании не строго различают структуры данных и структуры хранения, ограничиваясь представлением структуры данных в программе. Знание же возможных структур хранения для представления одной и той же структуры данных обеспечивает возможность выбора наиболее эффективной структуры хранения при реше­нии конкретной задачи.

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

Большинство современных вычислительных машин имеет ли­нейную оперативную память, состоящую из последовательности ячеек памяти. Ячейка — это наименьшая адресуемая часть памя­ти. Возможные значения адресов образуют адресное простран­ство модели ЭВМ (0,1,2, ..., n). Напомним, что по содержимому ячейки невозможно определить, какого типа данные в ней хра­нятся.

Для представления адреса в языках программирования имеет­ся особый тип данных, называемый указателем. Возможными значениями данных типа «указатель» является все адресное про­странство машины. Указатель содержит адрес другого объекта программы, может содержать также адрес любой ячейки памяти машины. Если переменная содержит адрес некоторого другого объекта, то говорят, что переменная указывает (ссылается) на этот объект. Указатель может ссылаться на любой объект про­граммы: простую переменную, массив, строку, структуру, функ­цию, другой указатель.

Различают типизированные и нетипизированные указатели. Типизированный указатель ссылается на данные определенного типа, а нетипизированный — на данные любого типа. Наличие указателей в языках программирования позволяет создавать бо­лее компактные и гибкие программы, работать с динамическими объектами, упрощает передачу параметров в процедуры.

Отображение структур данных в физические, т.е. в структуры хранения, было бы очень простым, если бы структура памяти соответствовала структурам данных. Такое соответствие наблю­дается только при представлении данных скалярных типов. Они размещаются в последовательных ячейках памяти, занимая одну или несколько ячеек. Форматы их представления определяются стандартами языка программирования и зависят от способа орга­низации памяти конкретной ЭВМ. Когда такого соответствия нет, тогда более сложные структуры памяти моделируются про­граммными средствами с использованием базовых типов данных, фундаментальных структур и указателей. При этом пользовате­лю ЭВМ представляется, что машина действительно имеет такую нетривиальную организацию памяти, зависящую от конкретно­го языка программирования.

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

Первая возможность связана с получением памяти. Данные могут размещаться либо в статической, либо в динамической па­мяти. Память под данные в программе может быть получена дву­мя способами. Первый способ — это когда для отдельных дан­ных, которые описаны в программе, при ее выполнении выделя­ется память, определяемая типом данных. Такая память является статической и сохраняется на время выполнения программы или ее частей. (Не путать со статическими данными в языке Си и дру­гих языках программирования.) Второй способ — это получение памяти по явному запросу в программе. В запросе указывается объем требуемой памяти, в случае наличия памяти операцион­ная система выделяет одну сплошную область памяти и возвра­щает адрес начала этой области. Такую память будем называть динамической памятью. За ее правильное использование отвечает программист. После того как потребность в динамической па­мяти отпала, она может быть освобождена также по явному зап­росу. Динамическая память может быть получена для структуры данных в целом по одному запросу. Тогда размеры структуры данных могут изменяться только в пределах фиксированной дли­ны полученной памяти, а число элементов в структуре будет ог­раничено. Если же получать память для каждого элемента по от­дельному запросу, число элементов не ограничивается, пока есть доступная память ЭВМ.

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

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

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

Используя различные допустимые сочетания этих возможно­стей, можно образовать различные структуры хранения данных.

Рассмотрим три вида структур хранения: вектор, список и сеть, на основе которых строятся многие другие структуры хра­нения.