Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЭ_У_Студентам / ТРПС_2010.doc
Скачиваний:
62
Добавлен:
05.06.2015
Размер:
4 Mб
Скачать

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

См. также распечатку

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

Линейный список является динамической структурой

  • Линейный список - множество, состоящее из N>=0 элементов (узлов), структура которого ограничивается их одномерным (линейным) относительным положением, определяемым свойствами:

  1. если n>0, Node1 - первый узел

  2. если 1<i<n, Nodei, i-му узлу предшествует Nodei-1, следует Nodei+1

  3. Noden - последний узел списка

  4. n=0 - список пуст.

При работе с динамическими линейными списками возможно возникновение нехватки (список пуст) и переполнения (список заполнен). При переполнении дальнейшая работа невозможна, так как очередная операция включения не может быть выполнена, нехватка соответствует состоянию «пустой список».

  • ФОРМЫ ПРЕДСТАВЛЕНИЯ ЛИНЕЙНЫХ СПИСКОВ В ПАМЯТИ

Последовательное распределение

Связанное распределение

  • В последовательной памяти (в виде массива)

Для размещения списка выделяется сплошной участок памяти; его размер известен заранее и остается неизменным. Элементы списка располагаются в последовательных ячейках памяти, один узел следует сразу за другим, местонахождение узла X[j] можно вычислить по формуле: LOC(X[j])=L0+c(j-1)

L0 - базовый адрес (адрес узла X[1]).

j – номер узла

c – размер значения списка

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

Const

ListSize=10

VAR

LIST:array[1..ListSize] of Real;

Top: 0..ListSize;

Top=0 – список пуст (нехватка)

Top= ListSize – список заполнен (переполнение)

или

*

^спец значение

  • В связанной памяти (в виде массива) (стр.295)

Type

List=^Node;

Node=record

info:real;

next:list;

end;

VAR

HEAD:LIST;

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

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

  • ВЫВОДЫ:

  1. Связанное распределение (-): дополнительная трата памяти для размещения ссылок на следующий узел.

  2. Последовательное (-): состояние нехватки возникает гораздо чаще, чем в случае св. списков (в первом случае размер списка ограничен размером массива, во втором – свободной оперативной памятью).

  3. Последовательное (+): быстрее осуществляется обращение к элементам (LIST[k] - для доступа к k-му элементу требуется фиксированное время), а в связанном списке потребуется выполнить k итераций:

i:=1; p:=Head;

while (p<>nil) and (i<k) do

begin

i:=i+1;

p:=p^.next

end;

  1. Связанное (+): проще выполняется операция вставки в середину связанного списка (необходимо только переустановка связей). В последовательной таблице (особенно больших размеров) вставка подразумевает перемещение большей части списка.

    • В связанной памяти:

    new(p);

    p^.info:=X;

    p^.next:= pr^.next;

    pr^.next:=p;

    • В последовательной памяти:

    for i:=Top downto k do

    A[i+1]:=A[i];

    A[k]:=X;

    Top:=Top+1

    Число перестановок

    Min=0 (в конец)

    Max=N (в начало)

    Среднее=N/2

  2. Связанное (+): проще выполняется операция удаления (необходимо только переустановка связи). При последовательном соединении удаление подразумевает перемещение большей части списка.

    • В связанной памяти:

    pr^.next:=p^.next;

    dispose(p)

    • В последовательной памяти:

    for i:=k to top-1 do

    A[i]:=A[i+1];

    top:=top-1;

    Число перестановок

    Min=0 (в конце)

    Max=N-1 (в начале)

    Среднее=(N-1)/2 ~ N/2

  3. Связанное распределение: проще организовать объединение/разбиение двух списков.

Пример (хотя бы на картинке)

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

Пример (хотя бы на картинке)

  1. Связанное распределение: возможна организация более сложных структур (из п.7).

  1. ОПЕРАЦИИ, ВЫПОЛНЯЕМЫЕ СО СТЕКОМ, ОЧЕРЕДЬЮ И ДЕКОМ. ДЕК С ОГРАНИЧЕННЫМ ВЫХОДОМ И ПОЛНЫЙ ДЕК. СТРУКТУРЫ ДАННЫХ, ИСПОЛЬЗУЕМЫЕ ДЛЯ РЕАЛИЗАЦИИ СТЕКА, ОЧЕРЕДИ, ДЕКА С ОГРАНИЧЕННЫМ ВЫХОДОМ И ПОЛНОГО ДЕКА.

  • СМ. РАСПЕЧАТКУ!!!

Все перемешано!!! Возьмите за основу текст распечатки.

Следует

  1. дать определения этих трех структур

  2. привести описание стека/очереди в непрерывной и связной памяти

  3. описать процедуры добавления/удаления элементов в виде псевдокода И/ИЛИ для непрерывной памяти И/ИЛИ для связанной памяти.

  4. Затем сказать, что полный дек – комбинация двух очередей (в непрерывной памяти или в виде двусвязного списка), а дек с ограниченным выходом – комбинация стека и очереди (описание добавления/удаления в этих структурах Вами уже будут описаны выше, просто сделайте ссылку).