RJVKO7O3GF624
Obraz wygenerowany przez sztuczną inteligencję. Przedstawia szachownicę z ustawionymi figurami. Tło jest czarne, a figury w odcieniach koloru niebieskiego.

I_R_W14_M42_C++ Ciekawe algorytmy rekurencyjne

Obraz wygenerowany przez sztuczną inteligencję Canva.ai
Źródło: domena publiczna.

Problem generowania permutacji polega na wyznaczeniu wszystkich możliwych uporządkowań elementów danego zbioru. Dla zbioru zawierającego 𝑛 różnych elementów istnieje dokładnie 𝑛 ! (silnia) permutacji, co sprawia, że liczba rozwiązań bardzo szybko rośnie wraz z rozmiarem danych.

Problem ten często rozwiązuje się za pomocą rekurencji, ponieważ każdą permutację można zbudować, ustalając jeden element na danej pozycji, a następnie rekurencyjnie generując permutacje pozostałych elementów. W praktyce algorytm polega na wyborze kolejnych elementów, zamianie ich miejscami oraz cofnięciu zmian po zakończeniu danego kroku (tzw. backtracking).

Generowanie permutacji jest nie tylko klasycznym zadaniem algorytmicznym, ale także ćwiczeniem logicznego myślenia, wykorzystywanym m.in. w kombinatoryce, testowaniu oprogramowania, kryptografii czy rozwiązywaniu zagadek logicznych. Ze względu na swoją strukturę problem ten doskonale ilustruje ideę rekurencji i systematycznego przeszukiwania wszystkich możliwych rozwiązań.

Przykład 1

Poniżej przedstawiono schemat (drzewo rekurencji) generowania permutacji dla 3 elementówA, B, C

Schemat generowania permutacji

Poziom 0 – wybór 1. elementu

  • A _ _

  • B _ _

  • C _ _

Poziom 1 – wybór 2. elementu

Z pozostałych dwóch elementów:

  • A B _

  • A C _

  • B A _

  • B C _

  • C A _

  • C B _

Poziom 2 – wybór 3. elementu (ostatni)

Pozostaje już tylko jeden element:

  • A B C

  • A C B

  • B A C

  • B C A

  • C A B

  • C B A

Wynik końcowy:

Dla 3 elementów otrzymujemy:

3!=6 permutacji

Zapis rekurencyjnego algorytmu generowania permutacji w postaci pseudokodu

Dane:

  • Dane wejściowe: tablica A o długości n

  • Parametr k oznacza aktualną pozycję, na której ustalamy element

Linia 1. procedura PERMUTACJE otwórz nawias okrągły A przecinek k przecinek n zamknij nawias okrągły. Linia 2. jeżeli k znak równości n. Linia 3. wypisz A. Linia 4. w przeciwnym razie. Linia 5. dla i od k do n. Linia 6. zamień A otwórz nawias kwadratowy k zamknij nawias kwadratowy z A otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. PERMUTACJE otwórz nawias okrągły A przecinek k plus 1 przecinek n zamknij nawias okrągły. Linia 8. zamień A otwórz nawias kwadratowy k zamknij nawias kwadratowy z A otwórz nawias kwadratowy i zamknij nawias kwadratowy prawy ukośnik prawy ukośnik cofnięcie zmiany otwórz nawias okrągły backtracking zamknij nawias okrągły.

Zastosowanie algorytmu generowania permutacji:

1. Szyfry przestawieniowe (transpozycyjne) - Jednym z najprostszych historycznych zastosowań permutacji są szyfry przestawieniowe, w których nie zmienia się znaków wiadomości, lecz ich kolejność. 

2. Permutacje jako klucze kryptograficzne - W kryptografii klucz może być permutacją zbioru elementów:

  • liter alfabetu (szyfry podstawieniowe),

  • bitów w bloku danych,

  • pozycji w tablicy.

3. Sieci podstawień i permutacji (SPN)  - Nowoczesne szyfry blokowe (np. AES) wykorzystują permutacje bitów i bajtów jako jeden z podstawowych mechanizmów:

  • podstawienie (S‑box) – zmiana wartości,

  • permutacja (P‑box) – zmiana położenia bitów.

4.  Kryptanaliza (łamanie szyfrów) - Generowanie permutacji jest także używane w atakach kryptograficznych, np.:

  • sprawdzaniu wszystkich możliwych kluczy (brute force),

  • testowaniu możliwych przestawień znaków,

  • analizie historycznych szyfrów (np. Enigma).