Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

29. Списки: односвязные

Наиболее простой способ объединить или связать некоторое множество элементов — это "вытянуть их в линию", то есть организовать линейный связный список (linear linked list).

В линейном односвязном списке (ЛОС) каждый элемент состоит из двух различных по назначению видов полей: содержательные (информационные) поля и поле структурного (или логического) указателя. В содержательных полях хранятся данные, ради которых и создавался список. Некоторые содержательные поля могут содержать указатели на данные, не вместившиеся в содержательные поля — такие указатели называются дополнительными или вторичными (secondary pointer). Поле логического указателя (logical pointer) хранит адрес в памяти следующего элемента списка. Пользуясь указателем (адресом), можно получить доступ к элементу списка, а от него к следующему и т. д., пока не будет достигнут последний элемент (см. рис. 7.1.). Поле указателя последнего элемента списка должно содержать признак "пустого" указателя (Nil), свидетельствующий о конце списка.

Свойство линейности односвязного списка определяется линейностью

логической упорядоченности его элементов: для каждого элемента (кроме первого и последнего) имеется единственный предыдущий и единственный последующий элементы. На рис. 7.1. представлена логическая структура ЛОС. Организованный таким образом список называют еще однонаправленным (one-way list).

Дескриптор ЛОС может быть реализован в виде отдельной записи и может содержать такую информацию о списке, как

1) код структуры,

2) имя списка,

3) указатель (адрес) начала списка (First) — этот указатель называется указателем списка (list pointer),

4) указатель на текущий элемент (Current),

5) текущее количество элементов в списке,

6) описатель (дескриптор) элемента.

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

Для доступа к желаемому элементу ЛОС в общем случае необходимо просматривать список с его начала, даже если указатель текущего элемента расположен близко от искомого элемента, но после него. В кольцевом списке (ring, circular, cyclic list), логическая структура которого представлена на рис. 7.2, очередной просмотр можно начинать с текущего элемента, поскольку элементы списка "связаны" в кольцо. Для этого в поле логического указателя последнего элемента помещается вместо "пустого" указателя указатель начала списка.

33. Алгоритм генерирования перестановок в лексикографическом порядке.

Перестановки

Комбинаторные алгоритмы не могут обойтись без простейших алгоритмов перестановок n-элементного множества. Пусть мы имеем n элементов:

a1, a2, ..., an

и некоторое свойство P, зависящее от поряка расположения этих элементов. Например, располагая 9 чисел 1, 2, ..., 9 в клетках квадрата со стороной 3, мы можем рассмотреть свойство "магичности" квадрата. Для того, чтобы найти все магические квадраты порядка 3 мы можем воспользоваться генеретором перестановок. Число перестановок n элементов равно n!. Это легко доказывается. Действительно, на первом месте может стоять любой из n данных элементов. Рассматривая все перестановки оставшихся n-1 элементов получаем связь числа перестановок C(n) и C(n-1):

C(n)=C(n-1)*n

С учетом того, что C(1)=1, мы и получаем, что C(n)=n!.

Алгоритм PERM1 лексикографический

procedure perm(x:integer);

var i,k,d:integer;

begin

if x=n then act else begin

perm(x+1);

for i:=x+1 to n do begin

d:=p[i];for k:=i downto x+1 do p[k]:=p[k-1];p[x]:=d;

perm(x+1);

for k:=x to i-1 do p[k]:=p[k+1];p[i]:=p[x];p[i]:=d;

end;

end;

end;