Аналитический аппарат

End.

Else

End.

Else

End.

Else

Begin

End.

Begin

Else

Begin

Else

begin á Определить Sk ñ;

for у Î Sk do

begin Xk:= y; Solve(k+1) end;

end;

end;

Конкретный набор требований, которым должны удовлетворять сгенерированные векторы, определяются множествами Sk, а также правилом проверки того, что Х – решение.

1. Алгоритм генерации r-размещений с повторениями. В размещениях с повторениями на k-месте должно стоять число из набора 1,…, n независимо от чисел, стоящих на предыдущих позициях. То есть для любого k всегда будет Sk= {1, …, n }.

Пример 2.1. Пусть r = 3; n =2. Надо получить следующие векторы Х: (1 1 1), (1 1 2), (1 2 1), (1 2 2), (2 1 1), … (2 2 2).

Обозначим А[j] – номер предмета, находящегося на j-м месте, j = 1,…r. Предлагается следующий алгоритм.

Procedure Razm_P(k);

if k=r+1 then write(A[1],…A[r]);

for y:=1 to n do

begin A[k]:=y; Razm_P(k+1);

end;

end;

Razm_P(1);

Назначение процедуры Razm_P(k) – получение k-й компоненты вектора Х =(A[1],…A[r]). Если k = r+1 – это означает, что вектор полностью получен, и надо его использовать (вывести на экран). В противном случае надо получить следующую компоненту. Так как на ее месте может стоять любое число от 1 до n, то Sk = {1, … n}, перебор элементов этого множества обеспечивается циклом for y:=1 to n do

2. Алгоритм генерации r-размещений без повторений. Отличие данного алгоритма от предыдущего в том, что каждое из возможных значений 1, … n элементов размещений можно использовать только один раз. Поэтому в процедуре Razm_BP используется массив dop[j], j = 1,…n, в котором dop[j] = 1, если значение j не было использовано и dop[j] = 0, в противном случае. При продвижении вглубь рекурсии значение j блокируется, чтобы его нельзя было использовать повторно, а при откате – восстанавливается.

Procedure Razm_BP(k);

if k=r+1 then write(A[1],…A[r]);

for y:=1 to n do

if dop[y] > 0 then

begin A[k]:=y; dop[y]:=dop[y]-1;

Razm_BP(k+1); dop[y]:=dop[y]+1;

end;

end;

begin for i:=1 to n do dop[i]:= 1;

Razm_BP(1);

Данный алгоритм можно также использовать для генерации перестановок без повторений при r = n.

3. Алгоритм генерации перестановок с повторениями. Этот алгоритм похож на предыдущий, только первоначально dop[j]=n[j] – число повторений j-го значения, j = 1,…m. По мере использования этого значения переменная dop[j] уменьшается, пока не станет равной 0. Это будет означать, что данное значение уже нельзя использовать. Предлагается следующий алгоритм генерации перестановок из m объектов при .

Procedure Perest_P(k);

begin if k=n0+1 then write(P[1],…P[n0]);

for y:=1 to m do

if dop[y] > 0 then

begin P[k]:=y; dop[y]:=dop[y]-1;

Lex(k+1); dop[y]:=dop[y]+1;

end;

begin n0=0;

for j:=1 to m do

begin dop[j]:=n[j]; n0:=n0+n[j]; end;

Lex(1);

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

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

Для обеспечения этого условия в генерации сочетаний используется цикл for y:=t to n do, а не for y:=1 to n do, как в размещениях, где переменная t подбирается по правилу if k<=1 then t:=1 else t:=А[k-1]+1.

Procedure Sochet_BP(k);

begin if k=r+1 then write(А[1],…А[r]);

begin if k<=1 then t:=1 else t:=А[k-1]+1;

for y:=t to n do

if dop[y] > 0 then

begin А[k]:=y; dop[y]:=dop[y]-1;

Sochet_BP(k+1);

dop[y]:=dop[y]+1;

end;

end;

end;

begin for i:=1 to n do dop[i]:= 1;

Sochet_BP(1);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: