¿Qué es un algoritmo para generar todas las combinaciones posibles de un conjunto dado de letras (por ejemplo, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’)?

Hola, aquí hay una implementación simple en C ++

#include

# define sync_false std :: ios_base :: sync_with_stdio (falso)
# define tr (c, it) para (typeof (c.begin ()) it = c.begin (); it! = c.end (); it ++)
# define todo (c) c.begin (), c.end ()

usando el espacio de nombres estándar;

int main () {
sync_false;
cadena s = “abdc”, temp_string; // también puedes leer ‘s’ de stdin. Di “cin >> s;”
ordenar (todos (s)); // requerido en caso de que sus caracteres de cadena no estén ordenados lexicográficamente
hacer{
temp_string = “”;
tr (s, it)
temp_string + = * it;
cout << temp_string << endl;

} while (next_permutation (todas (s)));
devuelve 0;
}

Explicación: “next_permutation” reorganiza los elementos en el rango dado en el siguiente lexicográficamente mayor permutación Entonces, para extraer todas las permutaciones posibles de la cadena dada, debemos comenzar con la disposición que es lexicográficamente más pequeña.

Si tiene curiosidad y desea saber más acerca de cómo “next_permutation” realiza los cálculos. Consulte stackoverflow.com y next_permutation – cppreference.com

EDITAR:

También podemos resolver este problema usando la recursividad. Supongamos que tenemos una lista de 3 números. Digamos [0,1,2], ahora todos los arreglos posibles para este conjunto serían

[0,1,2], [0,2,1], [1,0,2], [1,2,0], [2,0,1], [2,1,0]

El total es [matemáticas] 3! [/ matemáticas] formas. Ahora, si observamos cuidadosamente, descubriremos que estamos fijando el número en la posición [matemática] k [/ matemática] y calculando los arreglos de los números en posiciones mayores que [matemática] k [/ matemática]. Una vez que hayamos terminado de hacer los arreglos de los números en las posiciones mayores que [matemáticas] k [/ matemáticas], fijamos otros números en la posición [matemáticas] k [/ matemáticas] y aplicamos los mismos pasos nuevamente. Aplicando la misma regla para el tamaño de lista reducido. Ahora dicho esto, veamos cómo implementar esta lógica. Lo he implementado en C ++ pero puedes implementarlo en cualquier lenguaje que elijas.

#include
# define tr (container, it) para (typeof (container.begin ()) it = container.begin (); it! = container.end (); it ++)
usando el espacio de nombres estándar;
vacío permut (vector A, int k, int n) // n es el tamaño de la lista, k es el punto de partida.
{
si (k == n) {
rasgo){
cout << * it; // imprime el arreglo actual
}
cout << endl;
}más{
para (int i = k; i <n; i ++) {
intercambio (A [i], A [k]); // arregla uno cambiando a una posición fija
permut (A, k + 1, n); // hacer arreglos para el resto
intercambio (A [i], A [k]); // restaurar a original y luego arreglar otro y así sucesivamente ..
}

}
}
int main ()
{
vector A (3,0);
para (int i = 0; i <3; i ++) {
A [i] = i; // A = [0,1,2]
}
permut (A, 0,3); // permut ([0,1,2], 0, 3)
devuelve 0;
}

Nota: Para imprimir todos los arreglos de una cadena dada, puede considerar calcular los arreglos de todos los índices y finalmente imprimir los caracteres correspondientes en los índices. Supongamos que la cadena dada es “ABC”. Entonces, encontramos los arreglos de [0,1,2]. Digamos, tenemos [1,0,2] por lo que la disposición correspondiente sería “BAC”.

¡Espero que esto ayude!

Necesita generar todas las permutaciones de una matriz. Hay muchos algoritmos para lograr esto; los más simples son recursivos, pero también se pueden hacer de forma iterativa. Daré las versiones recursivas e iterativas del algoritmo de Heap en pseudocódigo; La ventaja es que estos algoritmos tienen solo un número mínimo de intercambios de elementos en la matriz y no necesitan realizar costosas operaciones de concatenación de matriz.

Recursivo:

función generar (matriz, n) {
if (n == 0) luego genera la matriz y devuelve
para (i = 0; i generar (matriz, n-1)
matriz de intercambio [n-1] y matriz [(n% 2) * i]
}
}

En el caso de su ejemplo, esta función debería llamarse con la matriz [‘a’, ‘b’, ‘c’, ‘d’, ‘e’] y su longitud, [math] n = 5 [/ math].

Iterativo:

función generate2 (array) {
n = longitud de la matriz
Inicialice la matriz p de longitud n a cero
matriz de salida
i = 1
mientras que (i si (p [i] swap array [i] y array [(i% 2) * p [i]]
matriz de salida
p [i] ++
i = 1
} más {
p [i] = 0;
i ++;
}
}
}

Esta función hace lo mismo que la función recursiva, pero no necesita que se le suministre la longitud de la matriz.

Posible versión de Python

def comb(data):
if len(data) <= 1:
return [data]
res = []
for i, c in enumerate(data):
for r in comb(data[:i]+data[i+1:]):
res.append([c]+r)
return res

La idea es comenzar con todos los elementos posibles seguidos de todas las combinaciones de todos los demás. Es un caso típico en el que expresar el problema de forma recursiva ofrece una solución sencilla.

Por cierto … era obvio por el contexto y el ejemplo dado que estabas usando la combinación de palabras como inglés simple, como en la combinación de la caja fuerte.

Pero lo que está buscando también tiene un nombre matemático oficial: se llama permutación . Los matemáticos también usan la combinación de palabras, pero solo cuando el orden de los elementos no importa .

Cuando el orden importa es una permutación.

Genere todas las combinaciones posibles de número de bit de tamaño 5 a partir de:
00000 a 11111. Ahora, imprima caracteres si el bit correspondiente está activado.
Entonces, 00001 se asignaría a “e”, 10010 se asignaría a “ad” y así sucesivamente.

En C ++ 11:

#include
#include
#include

int main ()
{
std :: string s = “abc”;
std :: sort (s.begin (), s.end ());
hacer {
std :: cout << s << '\ n';
} while (std :: next_permutation (s.begin (), s.end ()));
}

Fuente: std :: next_permutation – cppreference.com

Si no está interesado en el algoritmo por sí mismo, pero solo necesita los resultados, el módulo de herramientas de biblioteca estándar lo hace para cualquier colección iterable:

herramientas de importación
itertools.permutations (‘abc’)
[i para i en itertools.permutations (‘abc’)]
[(‘a’, ‘b’, ‘c’), (‘a’, ‘c’, ‘b’), (‘b’, ‘a’, ‘c’), (‘b’, ‘c ‘,’ a ‘), (‘ c ‘,’ a ‘,’ b ‘), (‘ c ‘,’ b ‘,’ a ‘)]

Para ver un ejemplo práctico del uso de la recombinación para generar variantes (en este caso para un corrector ortográfico), puede consultar spelchek, que realiza transposiciones y eliminaciones dentro de las palabras para identificar posibles correcciones ortográficas.

De hecho, estás buscando permutaciones. Aquí hay una gran explicación para encontrar toda la permutación de una cadena en orden ordenado lexicográficamente.

También tiene código en Java y Python. Permutación de cuerdas

Lo que estás buscando se llama permutaciones. Las combinaciones son una historia diferente. Hay un algoritmo recursivo para generar todas las permutaciones posibles de n objetos. Puede encontrarlo explicado aquí Generando Permutaciones Recursivamente

También hay un enfoque iterativo. Le permite generar permutaciones en orden lexicográfico simplemente cambiando 2 elementos y ordenando los elementos después de ellos. Puede leerlo aquí Permutación desplácese hacia abajo hasta ” Generación en orden lexicográfico”

Lo que estás buscando no son todas las combinaciones sino todas las permutaciones.

Escribí un código simple para generar todas las permutaciones: Subconjuntos vs Permutaciones [Guía de supervivencia]

Se llama Power Set y hay algunas rutas para llegar: http://rosettacode.org/wiki/Powe

Mi favorito personal es el que menciona Aashish Barnwal.

Esto podría explicarlo
bien – Imprime todas las permutaciones con la repetición de caracteres – GeeksforGeeks