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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Всі 6 перестановок 3 м’ячиків

Перестановкою або підстановкою скінченної множини \;X називається довільна бієктивна функція \pi\;:X\to\;X. Всього існує \;n! (факторіал) різних перестановок, де \;n = |X| (потужність множини (кількість елементів в ній) ).

Група перестановок[ред.ред. код]

Перестановки скінченної множини \;X утворюють групу щодо операції множення перестановок.

Тотожна перестановка[ред.ред. код]

Нейтральним елементом в групі перестановок є тотожна перестановка \;E, для якої виконується:

\forall x \in X: E(x) = x

Тотожна перестановка переводить множину \;X саму в себе.

Добуток перестановок[ред.ред. код]

Добуток перестановок — це послідовне виконання двох перестановок (композиція):

Якщо \;f,g— перестановки, то:

c = f\times\;g  \Leftrightarrow\; \forall\;x\in\;X: c(x)=g(f(x)).

Обернений елемент[ред.ред. код]

Кожна перестановка має обернену перестановку.

\forall перестановки f, \;\exists\;f^{-1} така що:

 f\times\;f^{-1} = f^{-1}\times\;f = E

Представлення перестановок[ред.ред. код]

Для зручності, перестановки розглядають над множиною \{1,2,\dots\;,n\} (будь-яку іншу скінченну множину можна відобразити в множину такого виду).

Запис у два рядки[ред.ред. код]

Запис f = \begin{pmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \\ 2 & 5 & 10 & 4 & 3 & 7 & 1 & 9 & 8 & 6\end{pmatrix} означає, що f — перестановка множини \{1,2,\dots\;,10\} і f(1) = 2, f(2) = 5, \dots\;,f(10) = 6 (кожне число у верхньому рядку матриці переводиться у відповідне число в нижньому рядку).

Запис в один рядок[ред.ред. код]

Уживанішим в літературі є запис перестановки в один рядок (верхній рядок не пишеться):

f = \begin{pmatrix} 2 & 5 & 10 & 4 & 3 & 7 & 1 & 9 & 8 & 6\end{pmatrix} (та сама перестановка, що і в прикладі запису у два рядки).

Циклічний запис[ред.ред. код]

Циклом перестановки \;\pi називається така послідовність \;x_1, x_2,\dots\;, x_n, що \pi(x_1) = x_2, \pi(x_2) = x_3, \dots\;, \pi(x_{n-1})=x_n, \pi(x_n)=x_1.

Приклад:

Перестановка \;f = \begin{pmatrix} 2 & 5 & 10 & 4 & 3& 7& 1 & 9 & 8 & 6 \end{pmatrix} має три цикли:

  1. 1\to\;2\to\;5\to\;3\to\;10\to\;6\to\;7\to\;1
  2. 4\to\;4
  3. 8\to\;9\to\;8

Циклічий запис перестановки — це запис через її цикли:

\pi = \begin{pmatrix} x^{1}_{1} & \dots\; & x^{1}_{n_1} \end{pmatrix}\begin{pmatrix} x^{2}_{1} & \dots\; & x^{2}_{n_2} \end{pmatrix}\dots\;\begin{pmatrix} x^{m}_{1} & \dots\; & x^{m}_{n_m} \end{pmatrix}

Так для перестановки з прикладу справедливим є запис: f = \begin{pmatrix}1 & 2 & 5 & 3 & 10 & 6 & 7\end{pmatrix}\begin{pmatrix}4\end{pmatrix}\begin{pmatrix}8 & 9\end{pmatrix}

Транспозиція — перестановка, що міняє місцями два елемента. Транспозиція є циклом довжини 2.

Алгоритми на перестановках[ред.ред. код]

Алгоритм отримання всіх перестановок[ред.ред. код]

Наведенний нижче алгоритм дозволяє послідовно отримати всі перестановки скінченної множини. Для зручності будемо вважати, що елементами множини є числа від 1 до n, що записані у масив A.

  1. Спочатку \forall i:A[i]=i (В масиві записана тотожна перестановка)
  2. Проглядаючи елементи з кінця масиву, знаходимо найбільше \;i таке, що \;A[i]<A[i+1].
    Якщо такого не має, то завершуємо роботу.
  3. Знаходимо максимальне \;j, j>i таке, що \;A[j]>A[i]
  4. Міняємо місцями \;i-й і \;j-й елементи: A[i]\leftrightarrow A[j]
  5. Перегортаємо частину масиву з \;i+1-го по останній (\;n-й) індекси включно:
    \forall k=\overline{i+1,\lfloor (i+n+1)/2 \rfloor}: A[k]\leftrightarrow A[i+n+1-k]
  6. Отримана нова перестановка. Повертаємося до п.2.

Аналіз складності алгоритму[ред.ред. код]

Кількість елементів, що розглядаються чи опрацьовуються на кроках 3 і 5 не перевищує кількість елементів, що переглядаються на кроці 2. На кроці 4 завжди виконується тільки одна операція обміну елементів. Отже визначальною для складності алгоритму є кількість операцій на кроці 2. Вона залежить від поточного стану множини і може змінюватися від 1 до n-1. Для визначення складності алгоритму достатньо оцінити середню кількість операцій на кроці 2.

Кількість перестановок для яких на кроці 2 буде переглядатись рівно \;k елементів така — C_n^{k+1}\cdot C_{k+1}^2\cdot(n-k-1)!.

Середня кількість переглядів елементів на кроці 2 для всіх можливих перестановок: \frac{1}{n!}\sum_{k=1}^{n-1}k\cdot C_n^{k+1}\cdot C_{k+1}^2\cdot(n-k-1)! =

 = \frac{1}{n!}\sum_{k=1}^{n-1}k\cdot\frac{n!}{(k+1)!(n-k-1)!}\cdot\frac{(k+1)!}{2\cdot(k-1)!}\cdot(n-k-1)! = \frac{1}{2}\sum_{k=0}^{n-2}\frac{k+1}{k!}<\frac{1}{2}\sum_{k=0}^{\infty}\frac{k+1}{k!}=e<3

Отже, в середньому на кроці 2 виконується менше ніж три перегляда елементів. Значить, такого ж порядку кількість операцій виконується на кроках 3 і 5. Звідси випливає, що отримання нової перестановки відбувається в середньому за константну кількість операцій \;O(1), тоді складність алгоритму отримання всіх перестановок буде відповідно \;O(n!).

Приклад роботи[ред.ред. код]

Для прикладу отримаємо всі перестановки множини з трьох елементів, розглянемо стани масиву на початку п.2, а також відповідні індекси \;i,j:

  1. A=(1,2,3) (i=2,j=3)
  2. A=(1,3,2) (i=1,j=3)
  3. A=(2,1,3) (i=2,j=3)
  4. A=(2,3,1) (i=1,j=2)
  5. A=(3,1,2) (i=2,j=3)
  6. A=(3,2,1) — завершення алгоритму.

Алгоритм послідовно отримав всі 6 можливих перестановок.

Алгоритм отримання кореня з перестановки[ред.ред. код]

Коренем з перестановки \;\pi називається така перестановка \;\psi, що \;\psi^2=\pi.

Справедливе наступне твердження: \forall \pi — перестановка \exists k\in N: \pi^k=E. Звідси випливає, що \;\pi^{k+1}=\pi. Якщо k+1 \; парне, то \pi^\frac{k+1}{2}=\psi — корінь з перестановки.

\;k = HCK(n_1,n_2,...,n_l), де НСК — найменше спільне кратне, а \;n_i — довжина i-го циклу в циклічному записі перестановки \;\pi. Отже, якщо всі \;n_i непарні, то k — непарне, а k+1 — парне, і корінь з перестановки гарантовано існує (достатньо просто піднести початкову перестановку до відповідного степеня).

Цей розв'язок неприйнятний, якщо перестановка має цикли парної довжини. Але це не означає, що таки перестановки взагалі не мають коренів.

Теорема про існування кореня з перестановки[ред.ред. код]

Корінь з перестановки існує тоді і тільки тоді, якщо \forall k \in N кількість циклів перестановки довжини \;2k — парна.

Доведення[ред.ред. код]

Спочатку доведемо необхідність умови. Припустимо існує корінь \;\psi, \psi^2=\pi. Розглянемо цеклічне представлення цієї перестановки: \;\psi=(x_1^1,...,x_{l_1}^1)...(x_1^m,...,x_{l_m}^m).

Якщо i-й цикл (x_1,...,x_{l_i})\; має непарну доажину, то при піднесенні перестановки до квадрата, він перейде в цикл (x_1,x_3,...,x_{2t+1},...,x_{l_i},x_2,x_4,...,x_{2p},...,x_{l_i-1})\; — теж непарної довжини. Тобто якщо в перестановці якийсь елемент належав циклові непарної довжини, то і в квадраті цієї перестановки елемент буде належати циклові непарної довжини.

Якщо ж i-й цикл (x_1,...,x_{l_i})\; має парну доажину, то при піднесенні перестановки до квадрата, він перейде в два цикли однакової довжини (x_1,x_3,...,x_{2t+1},...,x_{l_i-1})\; і (x_2,x_4,...,x_{2p},...,x_{l_i})\;.

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

Доведення достатності випливає з алгопитму знаходження кореня.

Опис алгоритму[ред.ред. код]

  1. Представити перестановку в циклічному вигляді.
  2. Перевірити виконання умови теореми. Якщо не виконується, то корінь не існує — завершити роботу.
  3. Перетворити кожен цикл непарної довжини (x_1, \dots, x_l)\; на цикл (x_1, x_{\frac{l+1}{2}+1}, x_2, x_{\frac{l+1}{2}+2}, \dots, x_k, x_{\frac{l+1}{2}+k}, \dots, x_{\frac{l+1}{2}-1}, x_{l}, x_{\frac{l+1}{2}})\;
  4. Розділити цикли парної довжини на пари рівної довжини. Кожну пару циклів (x_1^1,...,x_{l}^1)\; і (x_1^2,...,x_{l}^2)\; об'єднати в один цикл
    (x_1^1, x_1^2, x_2^1, x_2^2, \dots, x_k^1, x_k^2, \dots, x_l^1, x_l^2)\;

Оцінка складності[ред.ред. код]

Кожен з 4-х кроків алгоритму може бути виконаний за час O(n)\;, отже загальна складність — O(n)\;.

Приклад використання[ред.ред. код]

Для прикладу знайдем корінь з перестановки \;\pi=\begin{pmatrix}1 & 2 & 3 & 4 &5 &6 & 7\\3 & 4 & 1 & 7 & 6 & 5 & 2\end{pmatrix}

1. Циклічне представлення \;\pi = \begin{pmatrix}2 & 4 & 7\end{pmatrix}\begin{pmatrix}1 & 3\end{pmatrix}\begin{pmatrix}5 & 6\end{pmatrix}

2. Циклів довжини два парна кількість, умова теореми виконується.

3. Перетворимо цикл непарної довжини \begin{pmatrix}2 & 4 & 7\end{pmatrix}\to\begin{pmatrix}2 & 7 & 4\end{pmatrix}

4. Перетворимо пару циклів парної довжини \begin{pmatrix}1 & 3\end{pmatrix}\begin{pmatrix}5 & 6\end{pmatrix}\to\begin{pmatrix}1 & 5 & 3 & 6\end{pmatrix}

Шукана перестановка виглядає так: \psi = \begin{pmatrix}1 & 2 & 3 & 4 &5 &6 & 7\\5 & 7 & 6 & 2 & 3 & 1 & 4\end{pmatrix}, легко переконатись, що \psi^2=\pi\;.

Зауваження[ред.ред. код]

Наведений алгоритм знаходить тільки один корінь, в загальному ж випадку коренів може бути декілька.

Перестановки з повторенням[ред.ред. код]

Розглянемо n елементів m різних типів, причому в кожному типі всі елементи однакові. Тоді перестановки із всіх цих елементів з точністю до порядку розміщення однотипних елементів називаються перестановками з повторенням. Якщо ki — кількість елементів i-го типу, то k_1+k_2+\dots+k_m=n і кількість можливих перестановок з повтореннями дорівнює мультиноміальному коефіцієнту \textstyle \binom{n}{k_1,\ k_2,\ \dots,\ k_m} = \frac{n!}{k_1!k_2!\dots k_m!}.

Див. також[ред.ред. код]