Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cpp-avanzado:algorithm:next-permutation [2017/12/07 16:05] guty [Forma 2 (iterativa)] |
cpp-avanzado:algorithm:next-permutation [2017/12/08 18:22] (actual) guty |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
======= Permutaciones ======= | ======= Permutaciones ======= | ||
- | FIXME (¿Agregar definición de permutación? ¿noción intuitiva? ¿función biyectiva de un conjunto en sí mismo?) | + | FIXME (¿Agregar definición de permutación? ¿noción intuitiva? ¿función biyectiva de un conjunto en sí mismo? Por ahora queda el link a wikipedia)[[https://es.wikipedia.org/wiki/Permutaci%C3%B3n|Permutación Wikipedia]] |
Dado un arreglo de $n$ elementos (sus índices se encuentran en $ \left \{0,1, \dots, n-1 \right \}$), se plantea el problema de hallar todas las permutaciones del mismo. Ejemplo, si $n=3$, todas las permutaciones posibles de $\left \{ 0,1,2 \right \}$ son: | Dado un arreglo de $n$ elementos (sus índices se encuentran en $ \left \{0,1, \dots, n-1 \right \}$), se plantea el problema de hallar todas las permutaciones del mismo. Ejemplo, si $n=3$, todas las permutaciones posibles de $\left \{ 0,1,2 \right \}$ son: | ||
Línea 20: | Línea 20: | ||
===== Forma 1 (recursiva) ===== | ===== Forma 1 (recursiva) ===== | ||
- | Usaremos ''permutacion'' como un vector donde construiremos todas las permutaciones y ''elegido'' como un arreglo booleano (o idealmente un bitset FIXME (agregar link a bitset)), que nos dirá en la $i$-ésima posición, si el $i$-ésimo elemento ya fue elegido en el proceso constructivo de la permutación (y es un elemento actual de ''permutacion''). | + | Usaremos ''permutacion'' como un vector donde construiremos todas las permutaciones y ''elegido'' como un arreglo booleano (o idealmente un [[cpp-avanzado:bitset|Bitset]]), que nos dirá en la $i$-ésima posición, si el $i$-ésimo elemento ya fue elegido en el proceso constructivo de la permutación (y es un elemento actual de ''permutacion''). |
<code cpp> | <code cpp> | ||
Línea 58: | Línea 58: | ||
Tendremos como resultado que se modificó ''arreglo'' de manera in-place, a la siguiente permutación lexicográfica (que sea distinta a la original, esto cobra importancia si tenemos elementos repetidos). Por ejemplo: | Tendremos como resultado que se modificó ''arreglo'' de manera in-place, a la siguiente permutación lexicográfica (que sea distinta a la original, esto cobra importancia si tenemos elementos repetidos). Por ejemplo: | ||
- | * $(0,1,2,3) \overset{\texttt{next_permutation}}{\longrightarrow} (0,1,3,2)$ | + | * $(0,1,2,3) \xrightarrow{\texttt{next_permutation}} (0,1,3,2)$ |
- | * $(0,3,1,2) \overset{\texttt{next_permutation}}{\longrightarrow} (0,3,2,1)$ | + | * $(0,3,1,2) \xrightarrow{\texttt{next_permutation}} (0,3,2,1)$ |
- | * $(0,2,1,1,3) \overset{\texttt{next_permutation}}{\longrightarrow} (0,2,1,3,1)$ | + | * $(0,2,1,1,3) \xrightarrow{\texttt{next_permutation}} (0,2,1,3,1)$ |
+ | * $(0,3,2,1,1) \xrightarrow{\texttt{next_permutation}} (1,0,1,2,3)$ | ||
- | De esta forma, si queremos generar todas las permutaciones de un arreglo, **debemos comenzar con la permutación lexicográficamente más chica** (por ejemplo, llamando a ''sort'' FIXME (agregar link a sort) en el arreglo), y luego ejecutar el siguiente código. | + | De esta forma, si queremos **generar todas** las permutaciones de un arreglo, **debemos comenzar con la permutación lexicográficamente más chica** (por ejemplo, llamando a [[cpp-avanzado:algorithm:sort | sort]] en el arreglo), y luego ejecutar el siguiente código. |
<code cpp> | <code cpp> |