Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kolokvium / REV2_IZM.DOC
Скачиваний:
66
Добавлен:
19.04.2013
Размер:
345.09 Кб
Скачать

Представление структур данных в памяти эвм. Списковые структуры

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

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

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

Наиболее простой формой хранения данных в памяти ЭВМ является одномерный линейный список. Линейный список-это множество n>=0 объектов (узлов) Х(1), Х(2), Х(3)... Х(n) структур­ные свойства которого связаны только с линейным (одномерным) относительным расположением узлов. Если n>0, то X(1) является первым узлом; для 1<i<n узел X(i-1) предшествует узлу X(i), а узел X(i+1) следует за ним, X(n) является последним узлом, т. е. линейный список реализует структуру, которую можно опре­делить как линейное упорядочение элементов данных.

Линейный список X рассматривают как последовательность Х(1), Х(2), Х(3)... Х(n) компоненты которой идентифициро­ваны порядковым номером, указывающим их относительное рас­положение в X.

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

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

При реализации адресной функции используют два основных метода: последовательное распределение памяти; связанное рас­пределение памяти.

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

При последовательном распределении вектор данных логически отделен от описания структуры хранимых данных. Например, если структура данных представляет собой линейный список (напри­мер, файл записей фиксированной длины), то описание структуры хранится в отдельной записи и содержит:

а) N - размер вектора данных, т. е. количество элементов списка -записей;

б) m - размер элемента списка, т. е. размер записи, например, в байтах;

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

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

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

7.2

В качестве примера рассмотрим реализацию с помощью линей­ного списка при последовательном распределении памяти для ло­гической структуры типа регулярного двоичного дерева. Идея способа заключается в том, что, начиная с элемента памяти а(1), делают его корнем дерева, размещают там данные, соответ­ствующие узлу У1. В элементах памяти а(2) и а(3) размещают непосредственных потомков узла У1 - узлы У2 и У3 и т. д. В об­щем случае, непосредственные потомки узла У размещаются по адресам: а(2) и а(2+1). Адресная функция имеет вид, где-номер узла древовидной структуры;- базовый адрес;m- размер элемента памяти, который требуется для хранения данных узлов дерева (каждый узел представляет собой запись фиксированной длины). По дереву, которое при этом получается, можно двигаться в обоих направлениях, так как от узла Уможно перейти к его потомкам, удвоив. (или удвоив и прибавив единицу). Можно двигаться к узлу, являющемуся исходным для узла У, разделивпополам и отбросив дробную часть. Адрес соответствующего узлу элемента памяти определяется по адресной функции.

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

Корень дерева размещается в середину вектора. В элементах памяти от i-го до (m - 1)-го включительно размещается левое под­дерево. В элементах памяти от (m+1)-го до j-го включительно размещается правое поддерево. Аналогично процесс повторяется для размещения каждого поддерева. Приведенный способ позво­ляет реализовать двоичное сбалансированное дерево.

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

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

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

7.3

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

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

Для достижения большей гибкости при работе с линейными списками в каждый узел Х(i) вводятся два указателя. Один из указателей реализует связь рассматриваемого узла с узлом Х(i+1), а другой-с узлом Х(i-1).

Обозначим через SOC (Х(i)) указатель, хранящийся в записи X(i) связанного списка X, т. е. адрес следующего узла -X(i+1). Поскольку узел Х(n) не имеет следующего узла, введем символ Л, означающий конец списка X. В этом случае SOC (X(n))==.Л.

Базовый адрес зададим как указательную переменную ТОР (Х), значением которой является адрес первого узла. Тогда адресная функция для связанного однонаправленного линейного списка определяется в виде

Базовый адрес задается при обращении к списку.

Введя обозначение указателя на предыдущий узел -PRE (X(i)), запишем адресную функцию для связанного двунаправлен­ного линейного списка в прямом и обратном направлениях соот­ветственно:

Связанные списки - удобная форма представления динами­чески изменяющихся линейных структур. Любое произвольное изменение порядка записей, сокращение или расширение вектора данных в какой-либо записи не требуют перемещения записей в памяти ЭВМ. Для выполнения этих операций достаточно лишь изменить значения долей связи.

Однако доступ к конкретному узлу может оказаться намного длительнее, чем при последовательном распределении памяти. Чтобы получить доступ к данным, хранящимся в узле X(i), необ­ходимо сделать i итераций, используя ТОР (Х) и поля связи в узлах Х(), где=1, 2, ..., i, т.е. последовательно просмотреть все предшествующие узлы списка. Этот недостаток можно устра­нить различными способами.

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

7.5

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

Оптимальный размер группы (количество узлов в группе) при равновероятном нахождении узла в любой из групп , гдеn- количество элементов списка. Число групп .

При равновероятном нахождении узла в любой из групп при доступе к узлу необходимо просмотреть в среднем l\2 групп, а в каждой группе узлов. Следовательно, общее количество про­смотров

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

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

Важной разновидностью представления в памяти линейного списка является циклический список. Циклически связанный ли­нейный список обладает той особенностью, что связь от послед­него узла идет к первому узлу списка, т. е. SOC(X(n))= . Циклический список позволяет получить доступ к любому узлу списка, отправляясь от любого заданного узла. Циклические списки называются также кольцевыми структурами или кольцами.

7.6

Наряду с однонаправленными используются .двунаправленные циклические списки. В ряде случаев удобно использо­вать циклический список с указателями на голову списка из каж­дого узла (рис. 7.8), за исключением последнего узла -поскольку используется прямой указатель на голову списка.

7.7,8

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

Таким образом, основой построения связанных списковых структур являются указатели. При практической реализации на ЭВМ можно использовать три типа указателей (адресов записей): машинный (действительный); относительный; символический (идентификатор).

Первый тип указателей -действительный адрес- используется тогда, когда необходимо получить наибольшую ско­рость обработки данных, организованных в связанные списковые структуры. Этот тип указателей имеет серьезный недостаток- жесткую привязку записей к конкретному месту расположения в памяти. Если возникнет необходимость переместить список на но­вое место в памяти ЭВМ, то потребуется выполнить работу по изменению указателей во всех записях.

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

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

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

Указатели имеют следующие возможные пути использования: определяют направление доступа (можно двигаться только в тех направлениях, которые заданы указателями); соединяют вместе связанные по смыслу данные; отображают ориентированные ребра в древовидных или сетевых структурах; связывают память на дисках и организуют цепочки дисковых стра­ниц и т. п.

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

Соседние файлы в папке Kolokvium