Скачиваний:
35
Добавлен:
30.05.2020
Размер:
710.27 Кб
Скачать

у даному разі граничним є не елемент зі значенням 6, а той, ЩО стоїть на шостому місці у поточній послідовності. Отже, якщо 6-й елемент менший від того, що стоїть праворуч, і його не­ обхідно внести до розгляду, то зрозуміло, що на даному етапі для відновлення спадання правого фрагмента послідовності два останні елементи необхідно поміняти місцями (мал. 1, в). Після такого обміну можна констатувати два факти: граничним елементом є елемент, що займає шосту позицію у заданій послі­ довності, і її фрагмент, що знаходиться справа від граничного елемента, утворює упорядковану під послідовність (мал. 1, г). Поки що залишимо питання з'ясування характеру упорядкова­ ності елементів цієї підпослідовності без відповіді: у даному разі один елемент може утворювати як зростаючу, так і спадну підпослідовність. Отже, ми отримали два варіанти розташуван­ ня елементів заданої послідовності (мал. 1, а та г).

Просуваючись далі, підключимо до нашого фрагмента ще один елемент зліва, тобто розглянемо у послідовності, зображе­ ній на малюнку 2, а, три останніх елементи справа. Тепер гра­ ничним елементом буде елемент, розташований на 5-й позиції. Як бачимо, серед цих трьох елементів упорядкування відсутнє. «Порушником» є новий підключений елемент, і його треба

24

поміняти місцями з одним із елементів цього самого фрагмента послідовності. Але з яким саме із тих двох, що знаходяться праворуч (мал. 2, а)? Давайте не забувати, що ми намагаємося У кінцевому варіанті перевести нашу послідовність у стан «за спаданням», і фрагмент із двох останніх елементів задовольняє цю умову. Ця сама умова збережеться тоді і тільки тоді, коли ми знайдемо перший елемент справа, що перевищує той, що має бути включений до нашого фрагмента, тобто граничний елемент. Таким на малюнку 2, а є крайній справа елемент. Після обміну отримаємо послідовність, зображену на малюнку 2, б, у якій два останні елементи упорядковані за спаданням. І це зрозуміло, оскільки перед обміном в упорядкованому фрагменті послідовності були всі елементи, більші за той, який ми підключили, і претендентом на обмін був крайній справа елемент: менший з них увійшов у фрагмент, а більший вийшов за межі фрагмента і став на місце граничного. Ми не порушили спадання фрагмента, але «закинули» туди новий елемент послідовності (мал. 2,6).

Що нам дали описані дії? Чи одержали ми наступний ва­ ріант перестановки? Виявляється, що ні. Хоча два останні елементи підпослідовності упорядковані за спаданням, тобто ми створили ситуацію, до якої прагнемо у кінцевому варіанті, однак на даному кроці ми вчинимо наступне. Скажімо, так: для того, щоб не втратити жодного варіанта перестановок, кожного разу, коли по праву сторону від граничного елемента буде отримано упорядковану за спаданням підпослідовність, ми будемо максимально її «пошкоджувати». Для цього перево­ дитимемо підпослідовність правих елементів у стан упорядку­ вання за зростанням так, як це було на початку. А у нашому випадку два останніх елементи заданої послідовності поміняє­ мо місцями (мал. 2, б). Тим самим почнемо наш алгоритм упо­ рядкування фрагмента з початку, але вже з новим включеним туди елементом (мал. 2, в).

25

Залишилось відповісти на таке запитання: чи не втрачено одного з варіантів перестановок при зміні упорядкованості еле­ ментів підпослідовності зі спадання на зростання? Ні, не втра­ чено: цей варіант з'явиться на кроці генерації наступного пе­ реставлення і це ми побачимо далі.

На малюнку 3, а-и продемонстровано кілька кроків одер­ жання наступних варіантів перестановок.

Пересвідчитися у коректності такого алгоритму можна, якщо подивитися на варіанти послідовностей як на послідов­ ність звичайних чисел, що зростають за своїми значеннями: 1234567, 1234576, 1234657, 1234675, 1234756, 1234765, 1235467, ..., 7654321.

а)

Т

6

5

4

З

2

1

є)

є)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ґ

у{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

\

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

L

 

 

 

 

і

ь-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

є

S

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ґ

s

 

 

 

 

 

^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ґ

 

 

V

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ч

Ч

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

т

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J—

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<Ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-<

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2 3 4 5 6 7

 

 

 

 

 

 

б )

1 2 3 4 5 6 7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2 3 4 6 7 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'л~ґч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ц

і

>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f

h-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

г-Г\—

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ІҐ

•>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

V.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

< •

^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

ч

чJ

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

•4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

с

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ч

г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JЧ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

к

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2

3

 

 

4

5

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2

3

4

5

6

7

 

 

 

 

 

 

 

 

 

 

 

1 2

3

4

5

6

7

 

 

 

 

 

 

 

 

 

5)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

і

 

 

 

*)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2 3 4 7 5 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

т

 

f

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

н{"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1 -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

•II*»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

с

S

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(•

ч_

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

("

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<-?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

—ч5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2

3

4

5

6

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2

 

3

4

 

 

5

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

є)

1 2 3 4 7 6 5

 

 

 

 

 

 

 

 

 

 

Мал. З

26

 

 

 

 

 

_ 1

 

 

 

 

 

7

 

 

 

 

 

 

k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

H

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f

y-

 

 

 

 

 

 

 

"

 

 

О

 

 

 

 

 

c

 

 

 

 

_ J

 

\

 

 

 

 

 

 

fcl

 

 

 

^

 

О

 

 

1

IT

 

 

 

\

 

 

 

 

 

tor

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

_/S_

 

 

 

 

ІT^

 

 

 

 

 

 

 

4

У

 

 

 

 

 

 

__A—

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-c

s

 

 

 

 

 

 

 

 

 

-c

7V^

 

 

 

 

 

 

о

— C

4

 

 

 

 

 

 

 

 

-c

J

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

,)

 

 

 

 

 

 

 

If

J

 

 

 

 

 

 

 

 

 

f

 

s

 

 

 

 

 

 

 

і

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s5

 

 

 

 

 

 

 

 

1

Ї

 

 

 

 

 

 

 

 

Y

 

 

 

 

 

 

 

 

 

1 2

3

4

5

6

7

 

 

1 2

3

4

5

6

7

1 2

3

4

5

6

7

ж)

 

 

 

 

 

 

 

 

з)

 

 

 

 

 

 

 

в) 1 2 3 5 4 6 7

 

 

 

 

 

 

 

 

 

 

 

 

 

Мал. З (продовження)

 

 

 

 

 

 

 

 

 

 

 

 

Оскільки ми не завжди маємо справу з числами, то у загаль­ ному випадку будемо говорити про елементи деякої послідов­ ності елементів. Вважатимемо, що за певною ознакою можна визначити відношення між заданими елементами: більше, менше, дорівнює. Використовуючи наведене вище наочне схе­ матичне представлення генерації перестановок, сформулюємо алгоритм побудови лексикографічної послідовності заданих елементів.

1.Сформувати початковий стан розташування елементів «за зростанням».

2.Рухатися заданою послідовністю справа наліво, аналізу­ ючи поточні елементи. Крок до наступного елемента вліво ви­ конується лише у разі, якщо перехід здійснюється до елемента, що не більший від попереднього. Рухаючись таким чином послідовністю справа наліво, буде визначено граничний еле­ мент.

3.Знову почати рух від останнього елемента послідовності справа наліво, порівнюючи значення кожного поточного еле­ мента зі значенням граничного елемента, визначеного у п. 2. Рух припиняється тоді, коли трапиться елемент, більший за значенням від граничного елемента.

4.Поміняти місцями елементи із п. 2 та п. 3.

5.Усі елементи, розташовані після граничного елемента, розмістити у зворотному порядку, тобто в порядку зростання. Це можна зробити досить ефективно: оскільки цей фрагмент послідовності нами вже попередньо упорядкований за спадан­ ням, то для упорядкування його за зростанням необхідно лише поміняти місцями елементи, розміщені симетрично відносно центрального елемента даного фрагмента.

Найчастіше в алгоритмічних задачах необхідно генерувати всі можливі перестановки послідовності заданих елементів. Наприклад, визначення всіх можливих варіантів розміщення гостей за святковим столом. У такому випадку раціональніше

27

надати всім елементам заданої послідовності порядкові номери і організувати перестановки саме цих чисел.

Отже, надалі вважатимемо, що масив значень а[і], з еле­ ментів якого формуються перестановки, містить порядкові но­ мери заданої послідовності Ь[і]: 1, 2, 3, ..., N.

Процедура, що реалізує описаний алгоритм отримання всіх пе­ рестановок N заданих елементів, мовою Pascal виглядатиме так:

procedure perm; var і, k, с: byte; begin

i:=n;

while a[i - 1] > a[i] do dec(i);

k : = i - 1; i:=n;

while a[i] < a[k] do dec(i); c:=a[k];a[k] :=a[i];a[i] :=c;

for і := 1 to (n - k) div 2 do begin

{Визначення елемента, який порушує} {спадання послідовності.}

{Визначення елемента,} {який є претендентом для обміну.} {Обмін визначених елементів.} {Упорядкування за зростанням} {фрагмента послідовності,} {що знаходиться справа}

|c:=a[k + i];a[k + i] :=a[n- і + 1]; а[п - і + 1] := с {від позиції обміну.} end;

end;

Результатом виконання процедури perm буде один із ва­ ріантів його перестановки. Для одержання всіх перестановок необхідно використати цю процедуру в основній програмі у вигляді такого фрагмента:

f : = 1 ;

f o r І := 1

to П do

{Підрахунок кількості перестановок.}

f : = f * i ;

 

 

f o r І := 1

to П do

{Формування стартового стану масиву порядкових номерів.}

а[і]:=і;

 

 

f o r І := 1 to П do {Виведення першого варіанта перестановок заданих елементів.}

write(b[a[i]], ' '); writeln;

f o r І := 1 to f - 1 do

{Генерація решти перестановок порядкових номерів.}

begin

 

perm;

 

f o r j := 1 to П do

{Виведення поточної перестановки заданих елементів.}

write(b[a[j]],'');

 

writeln;

 

end;

 

А які зміни необхідно внести в алгоритм, щоб змінити лек­ сикографічний порядок визначених варіантів перестановок на зворотний? Зрозуміло, що необхідно:

28

-змінити початковий стан елементів послідовності на та­ кий, що розташований за спаданням;

-перегляд елементів поточної послідовності здійснювати зліва направо, визначаючи при цьому перший елемент, на яко­ му відбувається порушення спадання;

-переглядаючи послідовність зліва направо, визначити перший елемент, який більший за визначений у попередньому кроці, для наступного їх обміну місцями;

-упорядкувати всі елементи послідовності, що знаходяться на її початку, до елемента, визначеного у другому пункті цього алгоритму, за спаданням.

Завершимо знайомство з алгоритмом перестановок питання­ ми його тестування. Правильно складений алгоритм, тобто перевірений на невеликій множині елементів, гарантовано дає такий самий результат і на будь-якій іншій за кількістю еле­ ментів множині. Тому достатньо перевірити його роботу, на­ приклад, для N = 4 та значень елементів 1, 2, 3, 4, оскільки та­ ку кількість перестановок не складно проконтролювати. Ціка­ вою також є перевірка роботи алгоритму для інших значень елементів: символів, слів тощо.

Завдання

1.Розробити і реалізувати у вигляді програми алгоритм визна­ чення кількості всіх можливих перестановок.

2.Розробити і реалізувати у вигляді програми алгоритм гене­ рації всіх можливих варіантів перестановок.

3.Виконати завдання 1 та 2 для множини елементів 1, 2, 3, 4, 5, вивівши результат виконання програми у файл.

4.Модифікувати та реалізувати у вигляді програми алгоритм завдання 2 для випадку, коли варіанти перестановок форму­ ються у зворотному лексикографічному порядку.

5.Виконати завдання 4 для множини елементів 1, 2, 3, 4, 5, вивівши результат виконання програми у файл.

6.Модифікувати програми у завданнях 2-5 для множини різних символів.

7.Модифікувати програми у завданнях 2-5 для множини різних слів.

8.Зробити письмовий аналіз виконання завдань 1-7.

29

Сполучення

Перейдемо до питання визначення кількості способів, якими можна вибрати М із N різних елементів, а також і самих усіх можливих варіантів сполучень. Для цього скористаємося поняттям сполучення або вибірки (ft-combination).

Для обчислення кількості сполучень можна скористатися

раніше наведеною формулою: С% ==——— —-. Як бачимо, знову

Ml(N-M)l

маємо справу з обчисленням факторіала, а це означає, що навіть із незначним збільшенням значення N кількість сполучень значно зростає.

У разі, коли задача вимагає не тільки обчислення кількості сполучень, а ще й визначення всіх можливих варіантів вибору М різних елементів з N заданих, її можна звести до попередньої задачі про перестановки. Пояснимо хід таких міркувань.

Позначимо ті елементи, які будемо вибирати із заданого на­ бору, цифрою 1, а ті, які не вибираємо, - 0. Нехай нам задано 5 елементів, а треба вибрати будь-яких 3. Один із варіантів вибірки буде виглядати так: 10110. Це означає, що ми підго­ тували послідовність-маску, яка допомагає нам вибрати у дано­ му випадку перший, третій і четвертий елементи із 5 заданих. Можливий і такий варіант: 11100. У цьому разі ми вибрали три перших елементи із 5 заданих. Логіка підказує, що можна переставляти цифри 1 у п'яти заданих позиціях послідовностімаски певним чином до того часу, поки не одержимо комбіна­ цію 00111. Одержати всі необхідні нам варіанти можна за допо­ могою алгоритму побудови перестановок елементів множини, що складаються з 0 та 1, тобто вишикувавши їх у такому лекси­ кографічному порядку:

11100, 11010, 11001, 10110, 10101, 10011, 01110, 01101, 01011,00111.

Зверніть увагу на те, що у даному алгоритмі ми змінили лек­ сикографічний порядок перестановок у послідовності-масці, вишикувавши їх у порядку спадання. Це пов'язано з тим, що саме таким чином ми одержимо результат вибірок із заданої множини в лексикографічному зростаючому порядку.

Сформулюємо алгоритм отримання вибірки М із N різних елементів у загальному випадку.

1.Спочатку необхідно визначити стартову позицію розмі­ щення елементів: І.-.ІОдЛ).

МN-M

2.Далі застосувати алгоритм для визначення всіх можли­ вих перестановок цих елементів для визначення тих елементів заданої множини, які входять до поточної вибірки.

ЗО

3. Завершенням роботи алгоритму є ознака отримання ос­ танньої перестановки: 0...01..1.

N-М М

Наведемо фрагмент тексту Pascal-програми, що реалізує сформульований алгоритм:

for і := 1 to n - m do а[і] := 0;

for і := п - m + 1 to n do a[i]:=1;

for і := 1 to n do {Виведення першого варіанта перестановки заданих елементів.} ifa[i]=1 thenwrite(b[i],'');

writeln;

for І := 1 to f - 1 do

{Генерація решти перестановки порядкових номерів.}

begin

 

perm;

 

for j := 1 to n do

{Виведення поточної перестановки заданих елементів.}

ifa[i] = 1 thenwrite(b[i], " ) ; writeln;

end;

Однак слід зазначити, що для коректної роботи цього алго­ ритму необхідно дещо модифікувати процедуру організації пе­ рестановок. Це пов'язано з тим, Що елементами масиву а[і] є цифри 0 та 1, а в оригінальній процедурі ми розглядали різні за значеннями елементи. Крім цього, для отримання послідовнос­ тей вибірок у зворотному лексикографічному порядку необ­ хідно поміняти і знаки відношень між елементами, значення яких порівнюються.

Модифікований варіант процедури організації перестановок може виглядати так:

procedure perm; var і, k, с: byte; begin

i:=n;

while a[i - 1] >= a[i] do dec(i); k : = i - 1 ;

i:=n;

while a[i] <= a[k] do dec(i); c := a[kj; a[k] := a[i]; a[i] := c; fori:=1 t o ( n - k ) d i v 2 d o

begin

|c:=a[k + i];a[k + i] :=a[n -i + 1];a[n-i + 1] :=c end;

end;

31

Враховуючи наведену вище формулу для підрахунку кіль­ кості варіантів визначених вибірок із заданої множини для ви­ падку М < 0,5N, можна запропонувати таку послідовність дій для її обчислення, попередньо спростивши її до вигляду:

м

_(N-M + l)(N-M + 2)-...N

1

Ojy

 

;

 

М !

f := 1;

for і := n - m + 1 to n do f : = f * i ;

f1 : = 1 ;

for і := 1 to m do f1 :=f1 * i ;

f := f div f 1; {Використовуємо div для отримання цілого результату.}

Як і у випадку з перестановками, достатньо перевірити ко­ ректність роботи програми, що реалізує алгоритм визначення заданих вибірок, для N = 4 та значень елементів 1, 2, 3, 4. Тоб­ то тестування алгоритму зводиться до перевірки коректності його роботи на невеликій множині числових елементів. По­ дальше тестування можна провести для більших значень з ме­ тою порівняння часу виконання алгоритму та для елементів, значеннями яких є символи, слова тощо.

Завдання

1.Розробити і реалізувати у вигляді програми алгоритм визна­ чення кількості всіх можливих вибірок.

2.Розробити і реалізувати у вигляді програми алгоритм фор­ мування всіх можливих варіантів вибірок.

3.Виконати завдання 1 та 2 для множини елементів 1, 2, 3, 4, 5 та М = 3, вивівши результат виконання програми у файл.

4.Модифікувати програми у завданнях 2-4 для множини різ­ них символів.

5.Модифікувати програми у завданнях 2-4 для множини різ­ них слів.

6.Зробити письмовий аналіз виконання завдань 1-5.

Розміщення

Як і для попередніх елементів комбінаторики, визначимо можливість одержання кількості способів, якими можна ви­ брати М із N різних предметів і розмістити їх на М місцях, та самих цих розміщень, для чого скористаємося розміщенням. Розміщення елементів без повторень (fe-permutation) - це кіль­ кість способів, якими можна вибрати М із N різних предметів і розмістити їх на М місцях. Така задача зводиться до двох

1Якщо М > 0,5N, то раціональніше спростити вираз до вигляду:

_ ( М + 1)(М + 2)-...М

(N-M)l

32

попередніх: необхідно зробити всі можливі вибірки М елемен­ тів з ./V можливих і для кожної з них визначити всі перестанов­ ки. Нагадаємо формулу для обчислення кількості розміщень:

Ам_

т

N

(N-МУ.'

Так само як і для перестановок, можна обґрунтувати корект­ ність формули для обчислення кількості можливих розміщень. Будемо міркувати так: для розміщення першого елемента існує N позицій, для другого - (JV - 1), для третього залишається (N - 2) позицій і т. д., а для М-го елемента - (N - М) позицій. Тому обчислити кількість розміщень можна за допомогою та­ кого добутку: N * (N - 1) * (N - 2) * ... * (N - М + 1). Спростив­ ши наведену вище формулу, отримаємо:

< = VvT^r7: = N*(N-l)*(N-2)*...*(N-M + l). (N-M)l

Хоча на перший погляд останній запис виглядає громіздкі­ шим, однак щодо кількості виконуваних операцій для обчис­ лення А^ він набагато ефективніший.

Якщо використати процедуру для організації вибірки М еле­ ментів з N заданих з назвою регта та процедуру визначення всіх перестановок для цих вибраних елементів з назвою permit, то можна запропонувати такий фрагмент основної програми, який визначатиме всі можливі розміщення:

for І := 1 to f do

{Організація всіх можливих вибірок.}

begin

 

j : = 1 ;

 

for і := 1 to n do

{Виведення першого варіанта отриманої вибірки.}

ifa[i] = 1

 

then

 

begin

 

t[j] := b[i];

{Збереження у масиві f вибраних елементів}

 

{із заданого масиву £>.}

write(f_ouU[j], " ) ; inc(j);

end; writeln(f_out);

fori := 1 to f 1 — 1 do {Організація всіх перестановок вибраних елементів у масиві t.} begin

perm_t; {Одержання наступної перестановки елементів масиву t.} for j := 1 to m do {Виведення поточної перестановки елементів масиву f.}

write(f_out, t[j], " ) ; writeln(fout);

end;

perm_a;

{Одержання наступної вибірки із заданого масиву.}

end;

2 Інформатика, 9-І0кл.

33