Как найти обратную перестановку

    1. Обратные перестановки. Алгоритмы

Каждая перестановка
имеет себе обратную. Например, имеем
перестановку

,
для нее обратной будет перестановка

.

Алгоритм I.
(Обратная перестановка на месте). Заменим
перестановку X[1],
X[2]
X[n],
которая является перестановкой чисел
{1, 2, …, n},
обратной перестановкой.

I1. [Инициализация].
Присвоить m

n, j

-1
.

I2. [Следующий
элемент]. Присвоить i

X[m]
. Если i
< 0
, перейти
к шагу I5 (этот элемент уже был обработан).

I3. [Обратить один
элемент]. (В этот момент j
< 0
и
i
=
X[m].
Если m
не является наибольшим элементом своего
цикла, то первоначальная перестановка
давала
X[-j] = m).
Присвоить X[m]

j,
j

m,
m

i,
i

X[m].

I4. [Конец цикла?].
Если i
> 0
, перейти
к шагу I3
(этот цикл не закончен); иначе — присвоить
i

j.
(В последнем случае первоначальная
перестановка давала X[-j] = m,
где m
— наибольший элемент в его цикле.)

I5. [Сохранить
окончательное значение]. Присвоить X[m]

i.
(Первоначально X[-i]
было равно m).

I6. [Цикл по m].
Уменьшить m
на 1. Если m
> 0
, перейти
к I2,
в противном случае работа алгоритма
заканчивается.

Пример.
Найти обратную перестановку для строки:
6 2 1 5 4 3.

Решение.
В качестве второй строки запишем
порядковые номера цифр строки, получим:

Переставим строки
местами, получим:
.
Переставим столбцы местами, сохраняя
порядок элементов заданной строки,
получим
.
Таким образом, перестановка (3 2 6 4 5 1)
является результатом обращения исходной
строки 6 2 1 5 4 3.

Алгоритм J.
(Обращение
на месте). Этот алгоритм дает такой же
результат, как и алгоритм I, но на основании
другого подхода.

J1. [Сделать все
величины отрицательными]. Присвоить
X[k]
-X[k]
для 1

k

n
. Присвоить
также m
n
.

J2.
[Инициализация j].
Присвоить j

m.

J3.
[Нахождение отрицательного элемента].
Присвоить i

X[j].
Если i
> 0
, то
присвоить j

i
и повторить этот шаг.

J4.
[Обращение]. Присвоить X[j]

X[-i],
X[-i]

m.

J5.
[Цикл по m].
Уменьшить m
на 1, если m
> 0
, вернуться
к шагу J2.
В противном случае работа алгоритма
заканчивается.

Хотя алгоритм J
невероятно изящен, анализ показал, что
алгоритм I
намного его превосходит. На самом деле
оказывается, что среднее время выполнения
алгоритма J,
в сущности, пропорционально n
ln(n),
а среднее время выполнения алгоритма
I
пропорционально n.

Запись перестановки
в циклическом виде не единственна;
состоящую из шести элементов перестановку
(1 6 3) (4 5) (2) можно записать как (4 5) (3 1 6)
(2) и другими способами, что вносит
некоторую неопределенность. Поэтому
важно рассмотреть каноническую
форму

циклического представления, которая
является единственной.

Для получения
канонической формы перестановки выполним
следующие действия:

  1. Вписать
    в перестановку пропущенные единичные
    циклы.

  2. Внутри
    каждого цикла поместить на первое место
    наименьшее число.

  3. Расположить
    циклы в порядке убывания их первых
    элементов.

Пример.
Для циклической
перестановки (3 1 6) (5 4) найти каноническое

представление.

Решение.
(3 1 6) (5 4) (2) 
(1 6 3) (4 5) (2) 
(4 5) (2) (1 6 3).

Важным свойством
канонической формы является то, что
скобки можно опустить, а затем восстановить
единственным образом.

Последовательность
действий следующая:

1. Выбираем
направление просмотра строки слева
направо.

2. Расставляем “(“
в начале строки и “)” в конце строки.

3. Ищем минимальное
число и, если перед ним еще не стоит “(“
ставим “(“

4. Перед “(“ ставим
“)”.

5. Переходим к
анализу нерассмотренных еще элементов
строки.

6. Если еще не все
элементы рассмотрены, переход к п. 3.

7. Конец алгоритма.

Пример. Написать
каноническую форму для перестановки
(6 4 3) (5 1 2)

Решение.

1.
(6 4 3) (5 1 2)

2. (3 6 4) (1 2 5)

3. 3 6 4 1 2 5.

Обратный процесс
введения скобок циклов будет следующим
(3 6 4) (1 2 5).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

В чем разница между перестановкой и обратной перестановкой

Из любой таблицы инверсий d1,d2,…dn можно однозначно восстановить перестановку, которая порождает данную таблицу, путем последовательного определения относительного расположения элементов n, n-1,….,1 (в этом порядке). Например перестановку, соответствующую таблице инверсий (2,3,6,4,0,2,2,1,0) = (d1,d2,d3,d4,d5,d6,d7,d8,d9), можно построить следующим образом: выпишем число 9, так как d8=1, то 8 стоит правее 9. Поскольку d7=2, то 7 стоит правее 8 и 9. Так как d6=2, то 6 стоит правее двух уже выписанных чисел, таким образом получается расположение чисел 9,8,6,7. Припишем теперь 5 слева, потому что d5=0, помещаем 4 вслед за четырьмя уже выписных числами, 3 после 6 выписанных чисел (т.е. в правый конец) и получаем 5,9,8,6,4,7,3. Вставив аналогичным образом 2 и 1, придем к перестановке (5,9,1,8,2,6,4,7,3).

Обратные перестановки

Не следует путать «инверсии» перестановок с обратными перестановками. Пусть a1,a2,….an — различные шары, индексы которых свяжем с номерами шаров. Тогда исходное расположение шаров однозначно определяется тождественной перестановкой (e=1,2,…n)

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

Содержание

  • 1 Умножение перестановок
    • 1.1 Пример
  • 2 Обратная перестановка
    • 2.1 Получение обратной перестановки
  • 3 Группа перестановок
  • 4 Группа чётных перестановок
  • 5 Группа подстановок
  • 6 См. также
  • 7 Источники информации

Умножение перестановок

Определение:
Умножением (англ. multiplication) или композицией (англ. composition) перестановок, представленных в виде целочисленных функций , где позиция элемента, а — его номер, называется перестановка, получаемая по следующему правилу:
Утверждение:

Умножение перестановок ассоциативно:

Доказывается простым раскрытием скобок.

Перед прочтением примера перемножения перестановок рекомендуем познакомиться с циклами в данной статье: Действие перестановки на набор из элементов, представление в виде циклов

Пример

или

Обратная перестановка

Определение:
Обратной перестановкой (англ. inverse permutation) к перестановке называется такая перестановка, что:
Утверждение:

Для каждой перестановки существует перестановка, обратная ей.

Пусть дана перестановка , построим обратную ей перестановку : если , то . Очевидно, что данная перестановка является обратной к .

Также обратная перестановка единственна. Это следует из того, что для каждой -ой позиций в исходной перестановке однозначно определяется -ая позиций в обратной перестановке, значение которой есть

Определение:
Перестановка, равная своей обратной, называется инволюцией (англ. involution):
, то есть её представление в виде циклов не содержит цикла, размер которого больше двух.
Утверждение:

Количество инволюционных перестановок длины может быть получено по формуле: , где

Докажем формулу по индукции. Базой являются . Предположим, что для всех , где , , формула верна. Рассмотрим перестановку длины и попробуем найти количество инволюций этой длины. Существует инволюций, при (у которых последний элемент представляет собой цикл длины ), а число инволюций длины , содержащих в своём представлении в виде циклов цикл , где , (так как при фиксированных и имеем перестановок оставшихся элементов, которые не нарушают свойств инволюции). Таким образом,
Определение:
Перестановка, содержащая чётное количество инверсий, называется чётной (англ. even permutation), в противном случае нечётной (англ. odd permutation).
Определение:
Перестановка, меняющая местами только два элемента, называется транспозицией (англ. transposition).
Лемма:

Если в перестановке, длина которой больше , поменять местами элемента, то её четность изменится.

Доказательство:
Для элементов, стоящих рядом, истинность утверждения очевидна: их взаимное расположение относительно других элементов не изменилось, а транспозиция этих чисел изменяет количество инверсий на единицу. Пусть теперь между перемещаемыми элементами и находятся элементов, то есть перестановка имеет вид: , . Сначала поменяем последовательно с числами , а затем число с рядом стоящими . В итоге мы выполним транспозиций рядом стоящих элементов, то есть чётность перестановки изменится.

Получение обратной перестановки

Пусть в массиве содержится перестановка, длины , тогда после выполнения алгоритма в массиве будет содержаться перестановка, обратная ей.

fun reversePerm(p : int[], rep : int[])
  for i = 1 to n
      rep[p[i]] = i;

Группа перестановок

Определение:
Группой (англ. group) называется множество с заданной на нём бинарной операцией , удовлетворяющей следующим свойствам:

  1. — ассоциативность соответствующей бинарной операции.
  2. Существование нейтрального элемента относительно операции , такого, что для любого
  3. Для любого существует называемый обратным элементом, такой, что
Утверждение:

Множество перестановок с элементами с операцией умножения является группой (часто группу перестановок называют симметрической (англ. symmetric group), и обозначают ).

Свойства и (ассоциативность умножения и существование обратной перестановки для любой из перестановок) доказаны выше, а в качестве нейтрального элемента выступает тождественная перестановка ().

Мощность симметрической группы:

Теорема Кэли утверждает, что любая конечная группа изоморфна подгруппе некоторой группе перестановок.

Группа чётных перестановок

Определение:
Группа чётных перестановок (англ. alternating group) является подгруппой симметричной группы перестановок, образованной всеми чётными перестановками. Композиция не выводит из группы, так как если представить каждую перестановку группы в виде чётного числа транспозиций и перемножить их, чётность не изменится.
Утверждение:

Количество чётных перестановок длины равно количеству нечётных и равно

Пусть число число чётных перестановок , а нечётных . Сделаем транспозицию для всех чётных перестановок. Получим нечётных различных перестановок, то есть . Проделаем то же самое с нечётными перестановками. Получим, что , то есть и .

Группа подстановок

Определение:
Подстановкой (англ. substitution) называется всякое взаимно однозначное отображение множества первых натуральных чисел на себя.

Всякая подстановка может быть записана при помощи двух перестановок, подписанных одна под другой:

Где через обозначается то число, в которое при подстановке переходит число .

Определение:
Группой подстановок (англ. group of substitutions) называется некоторая совокупность подстановок, замкнутая относительно композиции отображений, определяющей бинарную операцию для подстановок на одном и том же множестве.

См. также

  • Теорема Кэли
  • Действие перестановки на набор из элементов, представление в виде циклов

Источники информации

  • Wikipedia — Involution

Given an array of size n of integers in range from 1 to n, we need to find the inverse permutation of that array.

An inverse permutation is a permutation which you will get by inserting position of an element at the position specified by the element value in the array. For better understanding, consider the following example: 

Suppose we found element 4 at position 3 in an array, then in reverse permutation, we insert 3 (position of element 4 in the array) in position 4 (element value). 

Basically, An inverse permutation is a permutation in which each number and the number of the place which it occupies is exchanged.

The array should contain element from 1 to array_size.

Example 1 : 

Input  = {1, 4, 3, 2}
Output = {1, 4, 3, 2}

In this, For element 1 we insert position of 1 from arr1 i.e 1 at position 1 in arr2. For element 4 in arr1, we insert 2 from arr1 at position 4 in arr2. Similarly, for element 2 in arr1, we insert position of 2 i.e 4 in arr2. 

Example 2 :
Input  = {2, 3, 4, 5, 1}
Output = {5, 1, 2, 3, 4}

In this example, for element 2 we insert position of 2 from arr1 in arr2 at position 2. similarly, we find the inverse permutation of other elements.
Consider an array arr having elements 1 to n.

Method 1: In this method, we take element one by one and check elements in increasing order and print the position of the element where we find that element. 

Implementation:

C++

#include <bits/stdc++.h>

using namespace std;

void inversePermutation(int arr[], int size) {

  for (int i = 0; i < size; i++) {

    for (int j = 0; j < size; j++) {

      if (arr[j] == i + 1) {

        cout << j + 1 << " ";

        break;

      }

    }

  }

}

int main() {

  int arr[] = {2, 3, 4, 5, 1};

  int size = sizeof(arr) / sizeof(arr[0]);

  inversePermutation(arr, size);

  return 0;

}

Java

import java.io.*;

class GFG {

    static void inversePermutation(int arr[], int size)

    {

        int i ,j;

        for ( i = 0; i < size; i++)

        {

            for ( j = 0; j < size; j++)

            {

                if (arr[j] == i + 1)

                {

                    System.out.print( j + 1 + " ");

                    break;

                }

            }

        }

    }

    public static void main (String[] args)

    {

        int arr[] = {2, 3, 4, 5, 1};

        int size = arr.length;

        inversePermutation(arr, size);

    }

}

Python3

def inversePermutation(arr, size):

    for i in range(0, size):

        for j in range(0, size):

            if (arr[j] == i + 1):

                print(j + 1, end = " ")

                break

arr = [2, 3, 4, 5, 1]

size = len(arr)

inversePermutation(arr, size)

C#

using System;

class GFG {

    static void inversePermutation(int []arr, int size)

    {

        int i ,j;

        for ( i = 0; i < size; i++)

        {

            for ( j = 0; j < size; j++)

            {

                if (arr[j] == i + 1)

                {

                    Console.Write( j + 1 + " ");

                    break;

                }

            }

        }

    }

    public static void Main ()

    {

        int []arr = {2, 3, 4, 5, 1};

        int size = arr.Length;

        inversePermutation(arr, size);

    }

}

PHP

<?php

function inversePermutation($arr, $size)

{

for ( $i = 0; $i < $size; $i++)

{

    for ($j = 0; $j < $size; $j++)

    {

    if ($arr[$j] == $i + 1)

    {

        echo $j + 1 , " ";

        break;

    }

    }

}

}

$arr = array(2, 3, 4, 5, 1);

$size = sizeof($arr);

inversePermutation($arr, $size);

?>

Javascript

<script>

    function inversePermutation(arr, size)

    {

        let i ,j;

        for ( i = 0; i < size; i++)

        {

            for ( j = 0; j < size; j++)

            {

                if (arr[j] == i + 1)

                {

                    document.write( j + 1 + " ");

                    break;

                }

            }

        }

    }

        let arr = [2, 3, 4, 5, 1];

        let size = arr.length;

        inversePermutation(arr, size);

</script>

Time Complexity: O(n*n)
Auxiliary Space: O(1)

Method 2: The idea is to use another array to store index and element mappings 

Implementation:

C++

#include <bits/stdc++.h>

using namespace std;

void inversePermutation(int arr[], int size) {

  int arr2[size];

  for (int i = 0; i < size; i++)

    arr2[arr[i] - 1] = i + 1;

  for (int i = 0; i < size; i++)

    cout << arr2[i] << " "

}

int main() {

  int arr[] = {2, 3, 4, 5, 1};

  int size = sizeof(arr) / sizeof(arr[0]);

  inversePermutation(arr, size);

  return 0;

}

Java

import java.io.*;

class GFG {

static void inversePermutation(int arr[], int size) {

    int arr2[] = new int[size];

    for (int i = 0; i < size; i++)

    arr2[arr[i] - 1] = i + 1;

    for (int i = 0; i < size; i++)

    System.out.print(arr2[i] + " ");

}

public static void main(String args[]) {

    int arr[] = {2, 3, 4, 5, 1};

    int size = arr.length;

    inversePermutation(arr, size);

}

}

Python3

def inversePermutation(arr, size) :

    arr2 = [0] *(size)

    for i in range(0, size) :

        arr2[arr[i] - 1] = i + 1

    for i in range(0, size) :

        print( arr2[i], end = " ")

arr = [2, 3, 4, 5, 1]

size = len(arr)

inversePermutation(arr, size)

C#

using System;

class GFG {

static void inversePermutation(int []arr, int size) {

    int []arr2 = new int[size];

    for (int i = 0; i < size; i++)

    arr2[arr[i] - 1] = i + 1;

    for (int i = 0; i < size; i++)

    Console.Write(arr2[i] + " ");

}

public static void Main() {

    int []arr = {2, 3, 4, 5, 1};

    int size = arr.Length;

    inversePermutation(arr, size);

}

}

Javascript

function inversePermutation(arr, size) {

    let arr2 = [];

    for (let i = 0; i < size; i++)

    arr2[arr[i] - 1] = i + 1;

    for (let i = 0; i < size; i++)

    console.log(arr2[i] + " ");

}

    let arr = [2, 3, 4, 5, 1];

    let size = arr.length;

    inversePermutation(arr, size);

Time Complexity: O(n)
Auxiliary Space: O(n)

Last Updated :
02 Mar, 2023

Like Article

Save Article


Определение обратной перестановки. Перестановка ψ из Sn называется обратной к перестановке φ из Sn , если φψ = ψφ = e.

Перестановку, обратную к φ , обозначают через φ−1

Пример. Найти обратную перестановку

Для того, чтобы найти обратную перестановку φ−1 , вставляем в калькулятор вторую строку Смотреть решение »

Композиция перестановок

 Композиция перестановок определяется как обычная композиция отображений: (φ◦ ψ)(j) = φ(ψ(j)) (j ∈ Xn ).

Композиция перестановок является перестановкой (композиция биективных отображений биективна).

Композицию перестановок часто называют произведением перестановок и вместо φ ◦ ψ  пишут просто φψ

Алгоритм — как найти композицию перестановок: Смотреть решение »

Как найти число инверсий в перестановке

Определение 1. Количество инверсий (беспорядка) в перестановке – это количество пар элементов (не обязательно соседних), в которых следующий элемент имеет меньший номер, чем предыдущий.
 

Пример 1.6. Найти количество инверсий в перестановке
(2, 3, 1, 6, 4, 5, 7).

Решение. Смотреть решение »

Понравилась статья? Поделить с друзьями:
  • Как найти разрешения для приложений на андроиде
  • Как найти закладки в google chrome
  • Как быстро найти золотистый имбирь
  • Как вк найти все свои ответы
  • Как самим составить букет невесты