std::next_permutation y prev_permutation en C++

std::siguiente_permutación

Se utiliza para reorganizar los elementos del rango [primero, último] en la siguiente permutación lexicográficamente mayor. Una permutación es cada una de las N! arreglos posibles que pueden tomar los elementos (donde N es el número de elementos en el rango). Se pueden ordenar diferentes permutaciones según cómo se comparan lexicográficamente entre sí. La complejidad del código es O(n*n!) que también incluye la impresión de todas las permutaciones.

Sintaxis: 

template 
bool next_permutation (BidirectionalIterator first,
                       BidirectionalIterator last);
Parameters: 
first, last : Bidirectional iterators to the initial
and final positions of the sequence. The range 
used is [first, last), which contains all the elements 
between first and last, including the element pointed 
by first but not the element pointed by last.

return value: 
true : if the function could rearrange 
the object as a lexicographically greater permutation.
Otherwise, the function returns false to indicate that 
the arrangement is not greater than the previous, 
but the lowest possible (sorted in ascending order).

Aplicación: next_permutation es encontrar el siguiente valor lexicográficamente mayor para una array de valores dada. 

Ejemplos: 

Input : next permutation of 1 2 3 is 
Output : 1 3 2

Input : next permutation of 4 6 8 is 
Output : 4 8 6

C++

// C++ program to illustrate
// next_permutation example
 
// this header file contains next_permutation function
#include <algorithm>
#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = { 1, 2, 3 };
 
    sort(arr, arr + 3);
 
    cout << "The 3! possible permutations with 3 elements:\n";
    do {
        cout << arr[0] << " " << arr[1] << " " << arr[2] << "\n";
    } while (next_permutation(arr, arr + 3));
 
    cout << "After loop: " << arr[0] << ' '
         << arr[1] << ' ' << arr[2] << '\n';
 
    return 0;
}

Producción: 

The 3! possible permutations with 3 elements:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
After loop: 1 2 3

std::prev_permutación

Se utiliza para reorganizar los elementos del rango [primero, último] en la permutación ordenada lexicográficamente anterior. Una permutación es cada una de las N! arreglos posibles que pueden tomar los elementos (donde N es el número de elementos en el rango). Se pueden ordenar diferentes permutaciones según cómo se comparan lexicográficamente entre sí. La complejidad temporal del código es O(n*n!) ya que cada permutación requiere un tiempo lineal. 

Sintaxis:  

template 
bool prev_permutation (BidirectionalIterator first,
                         BidirectionalIterator last );
parameters: 
first, last : Bidirectional iterators to the initial
and final positions of the sequence. The range 
used is [first, last), which contains all the
elements between first and last, including 
the element pointed by first but not the element
pointed by last.

return value: 
true : if the function could rearrange 
the object as a lexicographically smaller permutation.
Otherwise, the function returns false to indicate that 
the arrangement is not less than the previous, 
but the largest possible (sorted in descending order).

Aplicación: prev_permutation es encontrar el valor anterior lexicográficamente más pequeño para una array de valores dada. 

Ejemplos:  

Input : prev permutation of 3 2 1 is 
Output : 3 1 2 

Input : prev permutation of 8 6 4 is 
Output :8 4 6

C++

// C++ program to illustrate
// prev_permutation example
 
// this header file contains prev_permutation function
#include <algorithm>
 
#include <iostream>
using namespace std;
int main()
{
    int arr[] = { 1, 2, 3 };
 
    sort(arr, arr + 3);
    reverse(arr, arr + 3);
 
    cout << "The 3! possible permutations with 3 elements:\n";
    do {
        cout << arr[0] << " " << arr[1] << " " << arr[2] << "\n";
    } while (prev_permutation(arr, arr + 3));
 
    cout << "After loop: " << arr[0] << ' ' << arr[1]
         << ' ' << arr[2] << '\n';
 
    return 0;
}

Producción: 

The 3! possible permutations with 3 elements:
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
After loop: 3 2 1

Publicación traducida automáticamente

Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *