

El algoritmo Steinhaus-Johnson-Trotter o algoritmo Johnson - Trotter , también llamado cambios simples , es un algoritmo que lleva el nombre de Hugo Steinhaus , Selmer M. Johnson y Hale F. Trotter que genera todas las permutaciones deelementos. Cada par de permutaciones adyacentes en la secuencia resultante difieren al intercambiar dos elementos permutados adyacentes. De forma equivalente, este algoritmo encuentra un ciclo hamiltoniano en el permutoedro , un politopo cuyos vértices representan permutaciones y cuyas aristas representan intercambios.
Este método ya era conocido por los campaneros ingleses del siglo XVII , y Robert Sedgewick lo denomina «quizás el algoritmo de enumeración de permutaciones más destacado ». [ 1 ] Una versión del algoritmo puede implementarse de tal manera que el tiempo promedio por permutación sea constante. Además de ser simple y computacionalmente eficiente, este algoritmo tiene la ventaja de que los cálculos subsiguientes sobre las permutaciones generadas pueden acelerarse aprovechando la similitud entre permutaciones consecutivas. [ 1 ]
Algoritmo
La secuencia de permutaciones generada por el algoritmo de Steinhaus-Johnson-Trotter posee una estructura recursiva natural , que puede generarse mediante un algoritmo recursivo. Sin embargo, el algoritmo de Steinhaus-Johnson-Trotter en sí no utiliza recursión, sino que calcula la misma secuencia de permutaciones mediante un método iterativo sencillo. Una mejora posterior permite que se ejecute en un tiempo promedio constante por permutación.
Estructura recursiva
La secuencia de permutaciones para un número dadose puede formar a partir de la secuencia de permutaciones paracolocando el númeroen cada posición posible en cada una de las permutaciones más cortas. El algoritmo de Steinhaus-Johnson-Trotter sigue esta estructura: la secuencia de permutaciones que genera consiste enbloques de permutaciones, de modo que dentro de cada bloque las permutaciones coincidan en el orden de los números del 1 aly difieren únicamente en la posición de. Los bloques mismos se ordenan recursivamente, según el algoritmo de Steinhaus-Johnson-Trotter para un elemento menos. Dentro de cada bloque, las posiciones en las quese colocan en orden descendente o ascendente, y los bloques alternan entre estos dos órdenes: las colocaciones deEn el primer bloque están en orden descendente, en el segundo bloque están en orden ascendente, en el tercer bloque están en orden descendente, y así sucesivamente. [ 2 ]
Así, a partir de la única permutación en un elemento,
uno puede colocar el número 2 en cada posición posible en orden descendente para formar una lista de dos permutaciones en dos elementos,
Entonces, se puede colocar el número 3 en cada una de las tres posiciones diferentes para estas dos permutaciones, en orden descendente para la primera permutación 1 2, y luego en orden ascendente para la permutación 2 1:
El mismo patrón de colocación, alternando entre colocaciones descendentes y ascendentes de, se aplica a cualquier valor mayor de. [ 2 ] En secuencias de permutaciones con esta estructura recursiva, cada permutación difiere de la anterior ya sea por el movimiento de una posición a la vez deo mediante un cambio de dos números más pequeños heredados de la secuencia anterior de permutaciones más cortas. En cualquier caso, esta diferencia es simplemente la transposición de dos elementos adyacentes. CuandoEl primer y el último elemento de la secuencia también difieren en solo dos elementos adyacentes (las posiciones de los números).y), como puede probarse por inducción.
Esta secuencia puede ser generada por un algoritmo recursivo que construye la secuencia de permutaciones más pequeñas y luego realiza todas las inserciones posibles del número más grande en la secuencia generada recursivamente. [ 2 ] El mismo ordenamiento de permutaciones también puede describirse de manera equivalente como el ordenamiento generado por el siguiente algoritmo voraz . [ 3 ] Comience con la permutación identidadAhora, transponga repetidamente la entrada más grande posible con la entrada a su izquierda o derecha, de manera que en cada paso se cree una nueva permutación que no se haya encontrado antes en la lista de permutaciones. Por ejemplo, en el casoLa secuencia comienza con, luego se volteacon su vecino izquierdo para obtener. Desde este punto, volteandocon su vecino derechoproduciría la permutación inicial, por lo que la secuencia se inviertecon su vecino de la izquierday llega aetc. La dirección de la transposición (izquierda o derecha) siempre se determina de forma única en este algoritmo. Sin embargo, el algoritmo real de Steinhaus-Johnson-Trotter no utiliza recursión y no necesita llevar un registro de las permutaciones que ya ha encontrado. En cambio, calcula la misma secuencia de permutaciones mediante un método iterativo simple .
Versión original
Como lo describió Johnson, el algoritmo para generar la siguiente permutación a partir de una permutación dadarealiza los siguientes pasos.
- Para cadadel 1 al, dejarser la posición donde el valorse coloca en permutación. Si el orden de los números del 1 alen permutacióndefine una permutación par , seade lo contrario, deja.
- Encuentra el número más grandepara quédefine una posición válida en la permutaciónque contiene un número menor que. Intercambia los valores en las posicionesy.
Cuando no hay númeroSe puede encontrar que cumple las condiciones del segundo paso del algoritmo, el algoritmo ha alcanzado la permutación final de la secuencia y termina. Este procedimiento se puede implementar entiempo por permutación. [ 4 ]
Trotter ofrece una implementación alternativa de un algoritmo iterativo para la misma secuencia, en notación ALGOL 60 con comentarios breves . [ 5 ]
Debido a que este método genera permutaciones que alternan entre ser pares e impares, puede modificarse fácilmente para generar solo las permutaciones pares o solo las impares: para generar la siguiente permutación de la misma paridad a partir de una permutación dada, basta con aplicar el mismo procedimiento dos veces. [ 6 ]
La aceleración de Even
Una mejora posterior de Shimon Even optimiza el tiempo de ejecución del algoritmo al almacenar información adicional para cada elemento de la permutación: su posición y la dirección (positiva, negativa o cero) en la que se mueve actualmente (básicamente, esta es la misma información calculada utilizando la paridad de la permutación en la versión del algoritmo de Johnson). Inicialmente, la dirección del número 1 es cero, y todos los demás elementos tienen una dirección negativa:
En cada paso, el algoritmo encuentra el elemento más grande con una dirección distinta de cero y lo intercambia en la dirección indicada:
Si esto provoca que el elemento elegido alcance la primera o la última posición dentro de la permutación, o si el siguiente elemento en la misma dirección es mayor que el elemento elegido, la dirección del elemento elegido se establece en cero:
Después de cada paso, a todos los elementos mayores que el elemento elegido (que previamente tenía dirección cero) se les cambia la dirección para indicar movimiento hacia el elemento elegido. Es decir, positiva para todos los elementos entre el inicio de la permutación y el elemento elegido, y negativa para los elementos hacia el final. Así, en este ejemplo, después de que el número 2 se mueve, el número 3 vuelve a tener una dirección asignada:
Los dos pasos restantes del algoritmo parason:
Cuando todos los números quedan sin marcar, el algoritmo finaliza. [ 7 ]
Este algoritmo lleva tiempopor cada paso en el que el mayor número a moverse es. Por lo tanto, los intercambios que involucran el númerotoman solo tiempo constante; ya que estos intercambios representan todo menos unfracción de todos los intercambios realizados por el algoritmo, el tiempo promedio por permutación generada también es constante, aunque un pequeño número de permutaciones tomará una mayor cantidad de tiempo. [ 1 ]
Una versión más compleja y sin bucles del mismo procedimiento, adecuada para la programación funcional, permite que se ejecute en tiempo constante por permutación en todos los casos; sin embargo, las modificaciones necesarias para eliminar los bucles del procedimiento lo hacen más lento en la práctica. [ 8 ]
Estructuras relacionadas
Permutoedro
El conjunto de todas las permutaciones deLos elementos pueden representarse geométricamente mediante un permutoedro , el politopo formado a partir de la envoltura convexa devectores, las permutaciones del vector. Aunque se define de esta manera enespacio -dimensional, en realidad es unpolitopo de dimensión ; por ejemplo, el permutoedro de cuatro elementos es un poliedro tridimensional, el octaedro truncado . Si cada vértice del permutoedro se etiqueta mediante la permutación inversa a la permutación definida por sus coordenadas de vértice, el etiquetado resultante describe un grafo de Cayley del grupo simétrico de permutaciones enelementos, generados por las permutaciones que intercambian pares adyacentes de elementos. Así, cada dos permutaciones consecutivas en la secuencia generada por el algoritmo de Steinhaus-Johnson-Trotter corresponden de esta manera a dos vértices que forman los extremos de una arista en el permutoedro, y toda la secuencia de permutaciones describe un camino hamiltoniano en el permutoedro, un camino que pasa por cada vértice exactamente una vez. Si la secuencia de permutaciones se completa añadiendo una arista más de la última permutación a la primera de la secuencia, el resultado es un ciclo hamiltoniano. [ 9 ]
Códigos grises
Un código Gray para números en una base dada es una secuencia que contiene cada número hasta un límite dado exactamente una vez, de tal manera que cada par de números consecutivos difiere en uno en un solo dígito.permutaciones de lanúmeros del 1 alpuede ser colocado en correspondencia individual con elnúmeros del 0 alemparejando cada permutación con la secuencia de númerosque cuentan el número de posiciones en la permutación que están a la derecha del valory que contienen un valor menor que(es decir, el número de inversiones para las cualeses el mayor de los dos valores invertidos), y luego interpretando estas secuencias como números en el sistema numérico factorial , es decir, el sistema de base mixta con secuencia de basePor ejemplo, la permutacióndaría los valores,,,, y. La secuencia de estos valores,, da el número Las permutaciones consecutivas en la secuencia generada por el algoritmo de Steinhaus-Johnson-Trotter tienen números de inversiones que difieren en uno, formando un código Gray para el sistema numérico factorial. [ 10 ]
En términos más generales, los investigadores de algoritmos combinatorios han definido un código Gray para un conjunto de objetos combinatorios como un ordenamiento de los objetos en el que cada par de objetos consecutivos difiere de la forma mínima posible. En este sentido generalizado, el algoritmo de Steinhaus-Johnson-Trotter genera un código Gray para las permutaciones mismas. [ 11 ]
Historia
El método fue conocido durante gran parte de su historia como un método para el repique de campanas de iglesia: proporciona un procedimiento mediante el cual un conjunto de campanas puede tocarse a través de todas las permutaciones posibles, cambiando el orden de solo dos campanas por cambio. Estos llamados "cambios simples" o "caza simple" eran conocidos hacia 1621 para cuatro campanas, [ 12 ] y el método general se ha rastreado hasta un manuscrito inédito de 1653 de Peter Mundy . [ 6 ] Un libro de 1677 de Fabian Stedman enumera las soluciones para hasta seis campanas. [ 13 ] Más recientemente, los campaneros de cambio han respetado una regla que establece que ninguna campana puede permanecer en la misma posición durante tres permutaciones consecutivas; esta regla se viola con los cambios simples, por lo que se han ideado otras estrategias que intercambian varias campanas por cambio. [ 14 ]
El algoritmo lleva el nombre de Hugo Steinhaus , Selmer M. Johnson y Hale F. Trotter . Johnson y Trotter redescubrieron el algoritmo de forma independiente a principios de la década de 1960. [ 15 ] Un libro de Steinhaus de 1958, traducido al inglés en 1964, describe un rompecabezas relacionado, aparentemente imposible , que consiste en generar todas las permutaciones mediante un sistema de partículas, cada una moviéndose a velocidad constante a lo largo de una línea e intercambiando posiciones cuando una partícula adelanta a otra. [ 16 ] Un artículo de Hu y Bien de 1976 atribuyó a Steinhaus la formulación del problema algorítmico de generar todas las permutaciones, [ 17 ] y en 1989 su libro había sido (erróneamente) reconocido como una de las publicaciones originales del algoritmo. [ 18 ]
Véase también
- El algoritmo de Heap , un método diferente para listar todas las permutaciones.
- El método de Fisher-Yates permite generar permutaciones aleatorias.
Notas
- 1 2 3 Sedgewick (1977) .
- ^ Lenstra y Rinnooy Kan (1979) ; Salvaje (1997) , sección 3; Pájaro (2010) .
- ↑ Williams (2013) .
- ↑ Johnson (1963) .
- ↑ Trotter (1962) .
- 1 2 Knuth (2011) .
- ↑ Incluso (1973) .
- ↑ Erlich (1973) ; Dershowitz (1975) ; Sedgewick (1977) ; Pájaro (2010) .
- ↑ Véase, por ejemplo, la sección 11 de Savage (1997) .
- ↑ Dijkstra (1976) ; Knuth (2011) .
- ↑ Savage (1997) .
- ↑ Blanco (1996) .
- ↑ Stedman (1677) ; para listas de cambios simples en hasta seis campanas, ver pp. 48–80.
- ↑ McGuire (2003) ; Knuth (2011) .
- ↑ Johnson (1963) ; Trotter (1962) .
- ↑ Steinhaus (1964) .
- ↑ Hu y Tien (1976) .
- ↑ Ruskey (1989) .
Referencias
- Bird, Richard (2010), «Capítulo 29: El algoritmo de Johnson-Trotter», Perlas del diseño de algoritmos funcionales , Cambridge University Press, pp. 251-257 , doi : 10.1017/cbo9780511763199 , ISBN 9780511763199
- Dershowitz, Nachum (1975), "Un algoritmo simplificado sin bucles para generar permutaciones", Nordisk Tidskr. Informationsbehandling (BIT) , 15 (2): 158–164 , doi : 10.1007/bf01932689 , MR 0502206 , S2CID 121353303
- Dijkstra, Edsger W. (1976), "Sobre un desafío lanzado por David Gries" (PDF) , Acta Informatica , 6 (4): 357–359 , doi : 10.1007/BF00268136 , MR 0426492 , S2CID 7085805 . Aunque Dijkstra no cita ninguna literatura previa, un borrador anterior EWD502 revela que conocía a Trotter (1962) .
- Ehrlich, Gideon (1973), "Algoritmos sin bucles para generar permutaciones, combinaciones y otras configuraciones combinatorias", Journal of the ACM , 20 (3): 500– 513, doi : 10.1145/321765.321781 , S2CID 21493963
- Even, Shimon (1973), Combinatoria algorítmica , Macmillan
- Hu, TC ; Tien, BN (octubre de 1976), "Generación de permutaciones con elementos no distintos", The American Mathematical Monthly , 83 (8): 629–631 , doi : 10.1080/00029890.1976.11994195 , JSTOR 2319890
- Johnson, Selmer M. (1963), "Generación de permutaciones mediante transposición adyacente", Mathematics of Computation , 17 (83): 282–285 , doi : 10.1090/S0025-5718-1963-0159764-2 , JSTOR 2003846 , MR 0159764
- Lenstra, JK ; Rinnooy Kan, AHG (septiembre de 1979), "Un enfoque recursivo para la implementación de métodos enumerativos", Actas de la Escuela sobre Análisis y Diseño de Algoritmos en Optimización Combinatoria, Udine, Italia (PDF) , Informe técnico 8003/0, Universidad Erasmus de Róterdam; véase la Sección 2.1, "Un generador de cambio mínimo", págs. 3-8
- Knuth, Donald (2011), "Sección 7.2.1.2: Generación de todas las permutaciones" , El arte de la programación informática, volumen 4A: Algoritmos combinatorios, Parte 1
- McGuire, Gary (2003), Campanas, moteles y grupos de permutación , CiteSeerX 10.1.1.6.5544
- Ruskey, Frank (1989), "Generación por transposición de permutaciones alternas", Order , 6 (3): 227– 233, doi : 10.1007/BF00563523 , MR 1048093
- Savage, Carla (1997), "Un estudio de los códigos Gray combinatorios", SIAM Review , 39 (4): 605– 629, Bibcode : 1997SIAMR..39..605S , CiteSeerX 10.1.1.39.1924 , doi : 10.1137/S0036144595295272 , JSTOR 2132693 , MR 1491049
- Sedgewick, Robert (1977), "Métodos de generación de permutaciones", ACM Comput. Surv. , 9 (2): 137– 164, doi : 10.1145/356689.356692 , S2CID 12139332
- Stedman, Fabian (1677), Campanalogia, o, El arte de tocar campanas mejorado , Londres: W. Godbid – vía Early English Books Online Text Creation Partnership
- Steinhaus, Hugo (1964), Cien problemas de matemáticas elementales , Nueva York: Basic Books, págs. 49–50 , MR 0157881
- Trotter, HF (agosto de 1962), "Algoritmo 115: Perm", Communications of the ACM , 5 (8): 434– 435, doi : 10.1145/368637.368660 , S2CID 1013826
- White, Arthur T. (noviembre de 1996), "Fabian Stedman: ¿el primer teórico de grupos?", The American Mathematical Monthly , 103 (9): 771– 778, doi : 10.1080/00029890.1996.12004816 , JSTOR 2974446
- Williams, Aaron (2013), "El algoritmo de código gris voraz", en Dehne, Frank; Solis-Oba, Roberto; Sack, Jörg-Rüdiger (eds.), Algoritmos y estructuras de datos - 13.º Simposio Internacional, WADS 2013, London, ON, Canadá, 12-14 de agosto de 2013. Actas , Lecture Notes in Computer Science, vol. 8037, Springer, pp. 525–536 , doi : 10.1007/978-3-642-40104-6_46 , ISBN 978-3-642-40103-9
- Algoritmos combinatorios
- Permutaciones