Existe-t-il un algorithme de réarrangement temporel sur place linéaire? C'est l'algorithme que certaines mains particulièrement habiles sont capables d'exécuter: diviser uniformément un tableau d'entrée de taille égale, puis entrelacer les éléments des deux moitiés.
Mathworld a une brève page sur le shuffle de fusil . En particulier, je m'intéresse à la variété out-shuffle qui transforme le tableau d'entrée 1 2 3 4 5 6 en 1 4 2 5 3 6. Notez que dans leur définition, la longueur d'entrée est .
Il est simple d'effectuer cela en temps linéaire si nous avons un deuxième tableau de taille ou plus à portée de main. Copiez d'abord les derniers éléments dans le tableau. Ensuite, en supposant une indexation basée sur 0, copiez les premiers éléments des indices dans . Copiez ensuite les éléments du deuxième tableau dans le tableau d'entrée, en mappant les indices à . (Nous pouvons faire un peu moins de travail que cela, car les premier et dernier éléments de l'entrée ne bougent pas.)
Une façon de tenter de le faire sur place consiste à décomposer la permutation en cycles disjoints, puis à réorganiser les éléments en fonction de chaque cycle. Encore une fois, en supposant une indexation basée sur 0, la permutation impliquée dans le cas des 6 éléments est
Comme prévu, le premier et le dernier éléments sont des points fixes, et si nous permutons les 4 éléments du milieu, nous obtenons le résultat attendu.
Malheureusement, ma compréhension des mathématiques des permutations (et de leur ) est principalement basée sur wikipedia, et je ne sais pas si cela peut être fait en temps linéaire. Peut-être que les permutations impliquées dans ce brassage peuvent être rapidement décomposées? De plus, nous n'avons même pas besoin de la décomposition complète. Il suffit de déterminer un seul élément de chacun des cycles disjoints, car nous pouvons reconstruire le cycle à partir de l'un de ses éléments. Peut-être qu'une approche complètement différente est nécessaire.
De bonnes ressources sur les mathématiques connexes sont tout aussi précieuses qu'un algorithme. Merci!