Tengo un c++ vector
con std::pair<unsigned long, unsigned long>
objetos. Estoy tratando de generar permutaciones de los objetos del vector usando std::next_permutation()
. Sin embargo, quiero que las permutaciones sean de un tamaño dado, ya sabes, similar a la permutations
función en python donde se especifica el tamaño de la permutación devuelta esperada.
Básicamente, el c++
equivalente de
import itertools
list = [1,2,3,4,5,6,7]
for permutation in itertools.permutations(list, 3):
print(permutation)
(1, 2, 3)
(1, 2, 4)
(1, 2, 5)
(1, 2, 6)
(1, 2, 7)
(1, 3, 2)
(1, 3, 4)
..
(7, 5, 4)
(7, 5, 6)
(7, 6, 1)
(7, 6, 2)
(7, 6, 3)
(7, 6, 4)
(7, 6, 5)
python
c++
permutation
d4rk4ng31
fuente
fuente
(1, 1)
? Python permutaciones proporciona duplicados[(1, 1), (1, 1)]
, mientras questd::next_permutation
evita duplicados (solo{1, 1}
).Respuestas:
Puede usar 2 bucles:
Manifestación
fuente
std::next_permutation
"no está clara", ya que cuenta el intercambio (lineal). La extracción del sub vector puede mejorarse, pero no creo que cambie la complejidad. Además, el número de permutación depende del tamaño del vector, por lo que los 2 parámetros no son independientes.std::vector<T>& v
?v
actualmente). Podría pasar por referencia constante y crear una copia ordenada en el cuerpo en su lugar.Si la eficiencia no es la principal preocupación, podemos iterar sobre todas las permutaciones y omitir aquellas que difieren en un sufijo seleccionando solo cada
(N - k)!
una de ellas. Por ejemplo, paraN = 4, k = 2
, tenemos permutaciones:donde inserté un espacio para mayor claridad y
(N-k)! = 2! = 2
marqué cada permutación con<
.Salida:
fuente
Aquí hay un algoritmo eficiente que no usa
std::next_permutation
directamente, pero hace uso de los caballos de trabajo de esa función. Es decir,std::swap
ystd::reverse
. Como ventaja, está en orden lexicográfico .Y llamándolo tenemos:
Aquí está la salida:
Aquí hay un código ejecutable de ideone
fuente
bool nextPartialPermutation(It begin, It mid, It end)
Al girar la respuesta de Joseph Wood con la interfaz de iterador, es posible que tenga un método similar a
std::next_permutation
:Manifestación
fuente
Esta es mi solución después de pensarlo
Por favor comente sus pensamientos
fuente
permute
de hecho solo podríaset.insert(vec);
eliminar un factor importante.O(nb_total_perm * log(nb_res))
(nb_total_perm
que es sobre todofactorial(job_list.size())
ynb_res
tamaño del resultado:permutations.size()
), Así que sigue siendo demasiado grande. (pero ahora manejas entradas duplicadas contrarias a Evg)