Number of Transpositions in a Permutation
Last Updated :
19 Aug, 2022
Permutation A permutation is an arrangement of elements. A permutation of n elements can be represented by an arrangement of the numbers 1, 2, …n in some order. Eg. 5, 1, 4, 2, 3.
Cycle notation A permutation can be represented as a composition of permutation cycles. A permutation cycle is a set of elements in a permutation that trade places with one another.
For e.g.
P = { 5, 1, 4, 2, 3 }:
Here, 5 goes to 1, 1 goes to 2 and so on (according to their indices position):
5 -> 1
1 -> 2
2 -> 4
4 -> 3
3 -> 5
Thus it can be represented as a single cycle: (5, 1, 2, 4, 3).
Now consider the permutation: {5, 1, 4, 3, 2}. Here
5 -> 1
1 -> 2
2 -> 5 this closes 1 cycle.
The other cycle is
4 -> 3
3 -> 4
In cycle notation it will be represented as (5, 1, 2) (4, 3).
Transpositions:
Now all cycles can be decomposed into a composition of 2 cycles (transpositions). The number of transpositions in a permutation is important as it gives the minimum number of 2 element swaps required to get this particular arrangement from the identity arrangement: 1, 2, 3, … n. The parity of the number of such 2 cycles represents whether the permutation is even or odd.
For e.g.
The cycle (5, 1, 2, 4, 3) can be written as (5, 3)(5, 4)(5, 2)(5, 1). 4 transpositions (even).
Similarly,
(5, 1, 2) -> (5, 2)(5, 1)
(5, 1, 2)(4, 3) -> (5, 2)(5, 1)(4, 3). 3 transpositions (odd).
It is clear from the examples that the number of transpositions from a cycle = length of the cycle - 1.
Problem
Given a permutation of n numbers P1, P2, P3, … Pn. Calculate the number of transpositions in it.
Example:
Input: 5 1 4 3 2
Output: 3
Approach:
The permutation can be easily represented as a directed graph where the number of connected components gives the number of cycles. And (the size of each component – 1) gives the number of transpositions from that cycle.
Example Permutation : {5, 1, 4, 3, 2} -> (5, 1, 2)(4, 3)
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
#define N 1000001
int visited[N];
int goesTo[N];
int dfs( int i)
{
if (visited[i] == 1)
return 0;
visited[i] = 1;
int x = dfs(goesTo[i]);
return (x + 1);
}
int noOfTranspositions( int P[], int n)
{
for ( int i = 1; i <= n; i++)
visited[i] = 0;
for ( int i = 0; i < n; i++)
goesTo[P[i]] = i + 1;
int transpositions = 0;
for ( int i = 1; i <= n; i++) {
if (visited[i] == 0) {
int ans = dfs(i);
transpositions += ans - 1;
}
}
return transpositions;
}
int main()
{
int permutation[] = { 5, 1, 4, 3, 2 };
int n = sizeof (permutation) / sizeof (permutation[0]);
cout << noOfTranspositions(permutation, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int N = 1000001 ;
static int visited[] = new int [N];
static int goesTo[]= new int [N];
static int dfs( int i)
{
if (visited[i] == 1 )
return 0 ;
visited[i] = 1 ;
int x = dfs(goesTo[i]);
return (x + 1 );
}
static int noOfTranspositions( int P[],
int n)
{
for ( int i = 1 ; i <= n; i++)
visited[i] = 0 ;
for ( int i = 0 ; i < n; i++)
goesTo[P[i]] = i + 1 ;
int transpositions = 0 ;
for ( int i = 1 ; i <= n; i++) {
if (visited[i] == 0 ) {
int ans = dfs(i);
transpositions += ans - 1 ;
}
}
return transpositions;
}
public static void main (String[] args)
{
int permutation[] = { 5 , 1 , 4 , 3 , 2 };
int n = permutation.length ;
System.out.println(
noOfTranspositions(permutation, n));
}
}
|
Python3
N = 1000001
visited = [ 0 ] * N;
goesTo = [ 0 ] * N;
def dfs(i) :
if (visited[i] = = 1 ) :
return 0 ;
visited[i] = 1 ;
x = dfs(goesTo[i]);
return (x + 1 );
def noOfTranspositions(P, n) :
for i in range ( 1 , n + 1 ) :
visited[i] = 0 ;
for i in range (n) :
goesTo[P[i]] = i + 1 ;
transpositions = 0 ;
for i in range ( 1 , n + 1 ) :
if (visited[i] = = 0 ) :
ans = dfs(i);
transpositions + = ans - 1 ;
return transpositions;
if __name__ = = "__main__" :
permutation = [ 5 , 1 , 4 , 3 , 2 ];
n = len (permutation);
print (noOfTranspositions(permutation, n));
|
C#
using System;
class GFG {
static int N = 1000001;
static int []visited = new int [N];
static int []goesTo= new int [N];
static int dfs( int i)
{
if (visited[i] == 1)
return 0;
visited[i] = 1;
int x = dfs(goesTo[i]);
return (x + 1);
}
static int noOfTranspositions( int []P,
int n)
{
for ( int i = 1; i <= n; i++)
visited[i] = 0;
for ( int i = 0; i < n; i++)
goesTo[P[i]] = i + 1;
int transpositions = 0;
for ( int i = 1; i <= n; i++) {
if (visited[i] == 0) {
int ans = dfs(i);
transpositions += ans - 1;
}
}
return transpositions;
}
public static void Main ()
{
int []permutation = { 5, 1, 4, 3, 2 };
int n = permutation.Length ;
Console.WriteLine(
noOfTranspositions(permutation, n));
}
}
|
Javascript
<script>
let N = 1000001
var visited = new Array(N);
var goesTo = new Array(N);
function dfs( i)
{
if (visited[i] == 1)
return 0;
visited[i] = 1;
let x = dfs(goesTo[i]);
return (x + 1);
}
function noOfTranspositions( P, n)
{
for (let i = 1; i <= n; i++)
visited[i] = 0;
for (let i = 0; i < n; i++)
goesTo[P[i]] = i + 1;
let transpositions = 0;
for (let i = 1; i <= n; i++) {
if (visited[i] == 0) {
let ans = dfs(i);
transpositions += ans - 1;
}
}
return transpositions;
}
let permutation = [ 5, 1, 4, 3, 2 ];
let n = permutation.length;
document.write(noOfTranspositions(permutation, n));
</script>
|
Complexity Analysis:
- Time Complexity : O(n)
- Auxiliary space : O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...