En informática , la rotación de cadena lexicográficamente mínima ( LMSR ) o subcadena circular lexicográficamente mínima es el problema de encontrar la rotación de una cadena que posee el orden lexicográfico más bajo de todas dichas rotaciones. Por ejemplo, la rotación lexicográficamente mínima de "bbaaccaadd" sería "aaccaaddbb". La LMSR se utiliza ampliamente en la comprobación de igualdad de grafos , polígonos, autómatas y estructuras químicas. [ 1 ]
Es posible que una cadena tenga múltiples LMSR, pero para la mayoría de las aplicaciones esto no importa ya que las rotaciones deben ser equivalentes. Encontrar la rotación lexicográficamente mínima es útil como una forma de normalizar cadenas. Si las cadenas representan estructuras potencialmente isomorfas como grafos , la normalización de esta manera permite una simple comprobación de igualdad. [ 2 ] Un truco de implementación común al tratar con cadenas circulares es concatenar la cadena consigo misma en lugar de tener que realizar aritmética modular en los índices de la cadena.
Algoritmos
El algoritmo ingenuo
El algoritmo ingenuo para encontrar la rotación lexicográficamente mínima de una cadena consiste en iterar a través de rotaciones sucesivas , registrando la rotación lexicográficamente mínima encontrada. Si la cadena tiene una longitud n , este algoritmo se ejecuta en tiempo O ( n² ) en el peor de los casos.
El algoritmo de Booth
Booth (1980) propuso un algoritmo eficiente. [ 3 ] El algoritmo utiliza una función de preprocesamiento modificada del algoritmo de búsqueda de cadenas de Knuth-Morris-Pratt . La función de fallo para la cadena se calcula de forma habitual, pero la cadena se rota durante el cálculo, por lo que algunos índices deben calcularse más de una vez al repetirse. Una vez que todos los índices de la función de fallo se han calculado correctamente sin que la cadena vuelva a rotar, se sabe que se ha encontrado la rotación lexicográfica mínima y se devuelve su índice inicial. La corrección del algoritmo es algo difícil de comprender, pero es fácil de implementar.
def least_rotation ( s : str ) -> int : """Algoritmo de rotación de cadenas lexicográficamente mínimo de Booth.""" n = len ( s ) f = [ - 1 ] * ( 2 * n ) k = 0 for j in range ( 1 , 2 * n ): i = f [ j - k - 1 ] while i != - 1 and s [ j % n ] != s [( k + i + 1 ) % n ]: if s [ j % n ] < s [( k + i + 1 ) % n ]: k = j - i - 1 i = f [ i ] if i == - 1 and s [ j % n ] != s [( k + i + 1 ) % n ]: if s [ j % n ] < s [( k + i + 1 ) % n ] ]: k = j f [ j - k ] = - 1 else : f [ j - k ] = i + 1 return kResulta interesante observar que al eliminar todas las líneas de código que modifican el valor de k se obtiene la función de preprocesamiento original de Knuth-Morris-Pratt, ya que k (que representa la rotación) permanecerá en cero. El algoritmo de Booth se ejecuta en tiempo , donde n es la longitud de la cadena. El algoritmo realiza como máximocomparaciones en el peor de los casos, y requiere memoria auxiliar de longitud n para almacenar la tabla de funciones de fallo.
Algoritmo de canonización rápida de Shiloach
Shiloach (1981) [ 4 ] propuso un algoritmo que mejoraba el resultado de Booth en términos de rendimiento. Se observó que si hay q rotaciones lexicográficamente mínimas equivalentes de una cadena de longitud n , entonces la cadena debe constar de q subcadenas iguales de longitud n. . El algoritmo solo requiere comparaciones y espacio constante en el peor de los casos.
El algoritmo se divide en dos fases. La primera fase consiste en un filtrado rápido que descarta los índices que obviamente no son puntos de partida para la rotación lexicográficamente mínima. La segunda fase, a partir de los índices restantes, encuentra el índice de inicio de la rotación lexicográficamente mínima.
Algoritmo de factorización de Lyndon de Duval
Duval (1983) [ 5 ] propuso un algoritmo eficiente que implica la factorización de la cadena en sus palabras Lyndon componentes , que se ejecuta en tiempo lineal con un requisito de memoria constante.
Variantes
Shiloach (1979) [ 6 ] propuso un algoritmo para comparar eficientemente dos cadenas circulares y determinar su igualdad sin necesidad de normalización. Una aplicación adicional derivada de este algoritmo es la generación rápida de ciertas estructuras químicas sin repeticiones.
Wang y Ying (2024) propusieron una variante para la computación cuántica . [ 1 ] Demuestran que el algoritmo cuántico supera a cualquier algoritmo aleatorio (clásico) tanto en el peor como en el caso promedio.
Véase también
Referencias
- 1 2 Wang, Q., Ying, M. (2024). "Algoritmo cuántico para la rotación de cadenas lexicográficamente mínima". Theory Comput Syst . 68 : 29–74 . arXiv : 2012.09376 . doi : 10.1007/s00224-023-10146-8 .
{{cite journal}}: CS1 maint: varios nombres: lista de autores ( enlace ) - ↑ Kellogg S. Booth; Colbourn, Charles J. (1980). "Algoritmos de automorfismo de tiempo lineal para árboles, grafos de intervalos y grafos planares" . SIAM Journal on Computing . 10 (1). Society for Industrial and Applied Mathematics: 203–225 . doi : 10.1137/0210015 . ISSN 0097-5397 .
- ↑ Kellogg S. Booth (1980). "Subcadenas circulares lexicográficamente mínimas". Information Processing Letters . 10 ( 4–5 ). Elsevier: 240–242 . doi : 10.1016/0020-0190(80)90149-0 . ISSN 0020-0190 .
- ↑ Yossi Shiloach (1981). "Canonización rápida de cadenas circulares". Journal of Algorithms . 2 (2). Elsevier: 107– 121. doi : 10.1016/0196-6774(81)90013-4 . ISSN 0196-6774 .
- ↑ Jean Pierre Duval (1983). "Factorización de palabras sobre un alfabeto ordenado". Journal of Algorithms . 8 (8). Elsevier: 363– 381. doi : 10.1016/0196-6774(83)90017-2 . ISSN 0196-6774 .
- ↑ Yossi Shiloach (1979). "Un algoritmo rápido de comprobación de equivalencia para listas circulares". Information Processing Letters . 8 (5). Elsevier: 236– 238. doi : 10.1016/0020-0190(79)90114-5 . ISSN 0020-0190 .
- Problemas con cadenas de caracteres
- Lexicografía