Tengo una lista de N elementos y me pregunto cómo puedo recorrer la lista para obtener todas las combinaciones. No hay dobles, ¡así que necesito obtener todo N! ordenamientos La memoria extra no es un problema, estoy tratando de pensar en el algoritmo más simple pero estoy teniendo problemas.Algoritmo C++ para N! pedidos
Respuesta
Buena llamada (por así decirlo). Aunque para ser justos, el OP pidió el algoritmo * más simple *. –
C++ STL tiene next_permutation para este propósito.
Ampliando las respuestas de otros, aquí está un ejemplo de std :: next_permutation adaptado de cplusplus.com
#include <iostream>
#include <algorithm>
using namespace std;
void outputArray(int* array, int size)
{
for (int i = 0; i < size; ++i) { cout << array[i] << " "; }
}
int main()
{
int myints[] = { 1, 2, 3, 4, 5 };
const int size = sizeof(myints);
cout << "The 5! possible permutations with 5 elements:\n";
sort (myints, myints + size);
bool hasMorePermutations = true;
do
{
outputArray(myints, size);
hasMorePermutations = next_permutation(myints, myints + size);
}
while (hasMorePermutations);
return 0;
}
+1 para dar un ejemplo. –
No parece haber ningún punto en la variable 'bool'. Puedes simplemente 'do {...} while (std :: next_permutation (...));' –
@Charles: Es cierto, podría hacer eso. Con fines didácticos saqué la próxima_permutación ya que ese era el foco del código. – Bill
algoritmo simple utilizando recursividad:
Pseudocódigo
getPermutations(CurItemList , CurPermList)
if CurItemList.isempty()
return CurPermList
else
Permutations = {}
for i = 1 to CurItemList.size()
CurPermList.addLast(CurItemList.get(i))
NextItemList = CurItemList.copy()
NextItemList.remove(i)
Permutations.add(getPermutations(NextItemList, CurPermList))
CurPermList.removeLast()
return Permutations
// To make it look better
Permutations(ItemList)
return getPermutations(ItemList, {})
I no lo probé, pero debería funcionar. Tal vez no es la forma más inteligente de hacerlo, pero es una manera fácil. ¡Si algo está mal, por favor avíseme!
Intente crear el conjunto de combinaciones recursivamente con un recuento fijo de posibles elementos. El conjunto de todas las combinaciones posibles será la unión de los conjuntos de combinaciones de 1 elemento, 2 elementos, ... hasta N elementos.
Luego puede atacar cada combinación de tamaño fijo individualmente.
- 1. Arquitectura MySQL para n * (n - 1)/2 algoritmo
- 2. algoritmo de concordancia n-dimensional
- 3. 2^n algoritmo de complejidad
- 4. C#: N Para Loops
- 5. Algoritmo más rápido para calcular (a^(2^N))% m?
- 6. Cómo calcular n log n = c
- 7. ¿Están pedidos los parámetros C++ no de tipo para (función)?
- 8. ¿Hay un algoritmo O (n) para construir un montón máximo?
- 9. Algoritmo para resolver el rompecabezas de N Queens Dominación
- 10. Algoritmo para encontrar una subcadena común en N series
- 11. Algoritmo - Bin-packing, arregla contenedores para empacar n objetos
- 12. Algún algoritmo de ordenación de O (n)
- 13. Algoritmo para encontrar el punto especial k en el tiempo O (n log n)
- 14. C# algoritmo para generar jerarquía
- 15. Visualización del algoritmo para C#
- 16. Big-O complejidad de c^n + n * (log n)^2 + (10 * n)^c
- 17. Necesito un algoritmo óptimo para encontrar el mayor divisor de un número N de preferencia en C++ o C#
- 18. Regex (C#): Reemplace \ n con \ r \ n
- 19. algoritmo para python itertools.permutations
- 20. Rastrillo Tarea pedidos
- 21. Levenshtein Algoritmo de distancia mejor que O (n * m)?
- 22. pedidos 1:17 por pares perfectos cuadrados
- 23. NHibernate + Paging + Pedidos
- 24. personalizada LINQ pedidos
- 25. ¿Cómo guardo los pedidos?
- 26. C# Gráficos n Gráficos
- 27. Multi-columna entera pedidos
- 28. C# Algoritmo Diff para el texto
- 29. Pedidos personalizados en Django
- 30. ¿Hay un algoritmo de ordenamiento de enteros O (n)?
¿es una combinación o permutación? – sud03r
Consulte también una explicación de dos algoritmos diferentes en http://stackoverflow.com/questions/352203/generating-permutations-lazily/ – ShreevatsaR