I_R_W14_M42_C++ Ciekawe algorytmy rekurencyjne
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ń.
Poniżej przedstawiono schemat (drzewo rekurencji) generowania permutacji dla 3 elementów: A, 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:
Zapis rekurencyjnego algorytmu generowania permutacji w postaci pseudokodu
Dane:
Dane wejściowe: tablica
Ao długościnParametr
koznacza aktualną pozycję, na której ustalamy element
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).