Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpore_v02.doc
Скачиваний:
61
Добавлен:
21.09.2019
Размер:
2.18 Mб
Скачать

3 3(5) .Последовательная и связанная память. Представление линейных списков в последовательной и связанной памяти. Достоинства и недостатки того и другого представления

Линейный список - множество, состоящее из n>=0 элементов (узлов), структура которого ограничивается их одномерным (линейным) относительным положением, определяемым свойствами: *если n>0, Node1 - первый узел; *если 1<i<n, Nodei, i-му узлу предшествует Nodei-1, следует Nodei+1; *Noden - последний узел списка; *n=0 - список пуст.

Для представления линейного списка можно использовать массив (в непрерывной памяти) или ссылочную структуру, называемую связным списком (в связанной памяти).

Наиболее простой и естественный способ хранения линейного списка в памяти компьютера заключается в расположении элементов в последовательных ячейках, при котором один узел списка следует сразу же за другим. При этом справедливо:LOC(X[j+1]) = LOC(X[j])+с. где c - размер одного узла. LOC(X[j])=L[0] +cj, L[0] -константа, которая называется базовым адресом, т.е. адресом некоего узла X[0].

Последовательное распределение (представление) очень удобно для работы со стеком. Для этого достаточно иметь переменную T, которая называется указателем стека. Если стек пуст, то T=0. Для ввода нового элемента Y в стек следует выполнить такие действия:T←T+1; X[T]←Y.

если стек не пуст, можем положить Y равным верхнему узлу и удалить этот узел, выполнив:Y ← X[T]; T←T-1;

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

X<=Y (вставка в стек) :

T←T+1;

если T>M, то переполнение памяти!!! (OVERFLOW)

X[T]←Y.

X=>Y (удаление из стека) :

если T=0, то нечего удалять. (UNDERFLOW)

Y ← X[T];

T←T-1;

Представление очереди и дека организовано несколько сложнее. Для этого используются два указателя: F и R (для начала и конца очереди), где F=R=1, если очередь пуста. Так же, память, выделенная под очередь, можно представить в виде некоторого замкнутого кольца из M узлов: X[1], X[2], …, X[M], в котором X[1] следует за X[M]. Тогда две основные операции при работе с очередью выполняются следующим образом:

X=>Y (удаление из очереди) :

Если F=R, то UNDERFLOW;

Если F=M, то F ←1,

в противном случае F←F+1;

Y←X[R].

X=>Y (удаление из стека) :

если T=0, то нечего удалять. (UNDERFLOW)

Y ← X[T];

T←T-1;

В

L0 – базовый адрес;

с – размер узла;

A,B,C,D – произвольные адреса памяти;

0-пустая связь.

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

3(6)

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

First – это переменная связи, которая указывает на первый узел списка.

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

X<=Y (вставка в стек) :

P<=AVAIL;

INFO(P) ←Y;

LINK(P) ← T;

T← P.

X=>Y (удаление из стека) :

если T=0, то нечего удалять. (UNDERFLOW)

P← T;

T←LINK(P)

Y←INFO(P);

AVAIL<=P.

Операции P<=AVAIL и AVAIL<=P – это, соответственно, извлечение узла из специального списка свободной памяти и возращение узла обратно в список.

Мы предполагаем, что узел с адресом P состоит их двух полей INFO(P) и LINK(P). Переменная T указывает на “верхний” элемент стека.

X<=Y (вставка в очередь) :

P<=AVAIL;

INFO(P) ←Y;

LINK(P) ← 0;

Если F=0, то F←P , иначе LINK(R) ← P;

R← P.

X=>Y (удаление из очереди) :

если F=0, то нечего удалять. (UNDERFLOW)

P← F; // Переменные F и R

F←LINK(P); // указывают на первый

Y←INFO(P); // и последний узел

AVAIL<=P; // очереди соответственно.

если F=0, то R=0.

В случае если очередь пуста, то F и R равны 0.

Полотно 227

выводы:

1) При организации связанного распределения в памяти потребуется выделить дополнительное пространство для размещения связей. В некоторых ситуациях этот фактор может оказаться доминирующим. Но часто бывает, что хранимая информация все равно не занимает все слово (или узел) целиком, поэтому место для связи всегда найдется. Кроме того, во многих случаях несколько элементов комбинируется в одном узле (напр. структура), а потому связь может использоваться сразу для нескольких элементов данных. Однако, важнее то, что с помощью связанного распределения памяти выигрыш можно получить за счет частичного перекрытия таблиц, совместно использующих некоторые области памяти. Часто последовательное распределение не так рационально, как связанное, поскольку для его эффективной работы необходимо очень большое количество дополнительных вакантных ячеек памяти. 2) Операция удаления элемента в связанном списке выполняется проще. Например, для удаления элемента 3 необходимо только изменить связь с ним в элементе 2. А при последовательно распределении такое удаление подразумевает перемещение значительной части списка в другие ячейки. 3) При использ. схемы связанного распределения памяти проще выполняется и вставка элемента в середину списка. Например, для вставки элемента 2½ в список потребуется изменить только две связи. При работе с длинной таблицей с последовательным выделением памяти для вставки нужно будет выполнить гораздо больше действий, для чего потребуется чрезвычайно много времени.

4) Обращения к произвольным элементам списка гораздо быстрее осуществляется при последовательном выделении памяти. Для доступа к к-му элементу списка, где к - некоторая переменная, в случае последовательного распределения памяти потребуется фиксированное время, но для доступа к нужному элементу в случае связанной памяти потребуется выполнить к итераций. 5) В схеме связанного распределения памяти проще организовать объединение двух списков или разбиение списка на два других списка, которые могут увеличиваться независимо. 6) Схема связанного распределения памяти прекрасно подходит для организации более сложных структур, чем простые линейные списки. Например, ее можно применить для создания переменного количества списков переменного размера. Причем каждый узел одного из них может быть началом другого списка, к тому же узлы могут быть связаны между собой несколькими способами и образовывать другие списки и т.д. Т.о., технология связанного распределения памяти позволяет обойти ограничения, накладываемые последовательной природой компьютерной памяти. При выполнении одних операций она способствует достижению гораздо более высокой эффективности, а при выполнении других наоборот снижает ее. Обычно, совершенно ясно какая технология лучше всего подходит в конкретной ситуации. Поэтому часто в одной и той же программе используют списки разных типов.

8(1)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]