Necesito un algoritmo que produzca todas las cadenas con la siguiente propiedad. Aquí la letra mayúscula se refiere a las cadenas, y la letra minúscula a los caracteres. $XY$ significa la concatenación de la cadena $X$ y $Y$ .
Dejemos que $\Sigma = \{a_0, a_1,\ldots,a_n,a_0^{-1},a_1^{-1},\ldots,a_n^{-1}\}$ sea el conjunto de caracteres utilizables. Toda cadena está formada por estos símbolos.
Poner fuera cualquier conjunto $S_n$ con la siguiente propiedad logra el objetivo.( $n\geq 2$ )
-
Si $W\in S_n$ entonces cualquier desplazamiento cíclico de $W$ no está en $S_n$
-
Si $W\in S_n$ entonces $|W| = n$
-
Si $W\in S_n$ entonces $W \neq Xa_ia_i^{-1}Y$ , $W \neq Xa_i^{-1}a_iY$ , $W \neq a_iXa_i^{-1}$ y $W \neq a_i^{-1}Xa_i$ para cualquier cadena $X$ y $Y$ .
-
Si $W\not \in S_n$ , $S_n \cup \{W\}$ violará al menos una de las 3 propiedades anteriores.
Está claro que cualquier algoritmo que se pueda inventar es un algoritmo exponencial. pero sigo buscando un algoritmo rápido porque esto tiene algunos usos prácticos. Al menos para $\Sigma=\{a_0,a_1,a_0^{-1},a_1^{-1}\}$ y $n<25$ .
El enfoque ingenuo para mi aplicación práctica requiere $O(4^n)$ tiempo. Genera todas las cadenas de longitud n. Cuando se genera una nueva cadena, el programa crea todas las permutaciones cíclicas de la cadena y comprueba si se han generado antes a través de una tabla hash. Si no es así, la añade a la lista de cadenas resultantes. La cantidad total de operaciones son $O(n4^n)$ y eso suponiendo un hashing perfecto. 12 es el límite.
¿Hay mejores enfoques? Claramente se generaron muchas cadenas inútiles.
Edición: El uso práctico es encontrar el máximo de la auto intersección mínima de una curva en un toro con un agujero. Cada curva puede ser caracterizada por una cadena descrita anteriormente. Por lo tanto, tengo que generar cada cadena y alimentar a un programa que calcular la auto-intersección mínima.