Considérons une permutation des entiers 1
, ... n
,, comme celui-ci pour n = 6
:
[5,2,4,3,6,1]
Si vous voyez la permutation comme un mappage de [1,2,3,4,5,6]
à [5,2,4,3,6,1]
, la permutation peut être décomposée en cycles disjoints . Un cycle est un sous-ensemble d'éléments qui se mappent les uns aux autres. Par exemple, 1
obtient mappé sur 5
, qui est mappé sur 6
, qui est mappé sur 1
. Donc, un cycle est [1,5,6]
. Les autres cycles sont[2]
et [3,4]
. Ainsi, le nombre de cycles pour cette permutation est 3
.
En général, les cycles d'une permutation sont uniques (dans l'ordre) et le nombre de cycles pour une permutation de taille n
varie de 1
à n
.
Le défi
Étant donné une permutation non vide, affichez son nombre de cycles.
L' entrée est une matrice formée par les n
nombres entiers 1
, 2
...,n
où n > 0
. Chaque entier apparaît exactement une fois. L'ordre dans lequel ils apparaissent définit la permutation, comme dans l'exemple ci-dessus.
Au lieu d'un tableau, vous pouvez utiliser une liste, une chaîne avec un séparateur entre les nombres, une entrée distincte pour chaque numéro, ou tout ce qui est raisonnable.
Pour une permutation de taille n
, au lieu de l'ensemble basé sur 1 d'entiers 1
, ..., n
vous pouvez toujours utiliser l'ensemble basé sur 00
, ..., n-1
. Si oui, veuillez l'indiquer dans votre réponse.
Le code devrait fonctionner n
jusqu'à 20
un délai raisonnable, disons moins d'une minute.
Code golf. Tous les buildins autorisés.
Cas de test
Cela suppose une entrée de tableau basée sur 1.
[1] -> 1
[3,2,1] -> 2
[2,3,4,5,1] -> 1
[5,2,4,3,6,1] -> 3
[8,6,4,5,2,1,7,3] -> 2
[4,5,11,12,7,1,3,9,10,6,8,2] -> 1
[4,2,5,11,12,7,1,3,9,10,6,8] -> 5
[5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3
[14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7
en relation
Ce défi connexe demande les cycles réels de la permutation, pas le nombre d'entre eux. Ne nécessiter que le nombre de cycles peut conduire à des algorithmes plus courts qui contournent la génération des cycles réels.
1
, ..., n
dans cet ordre. Pouvez-vous préciser comment un mappage peut être une entrée? Est-ce une structure de données?
dict
. Je veux avoir {1: 2, 2: 1}
une entrée au lieu de [2, 1]
.