Dec 1, 2020
   
   
    summary of permutation algorithm
   
    
    
    
    
     Edit me
    
   Permutation
refer by; exercise problem
Using flag array
- by using boolean array, you can make permutations of integers.
void permu(vector<int> cur, int flag[10], int N){
    if(cur.size() == N) return;
    
    for(int i = 0; i < 10; i++){
        if(!flag[i]){
            flag[i] = true;
            cur.push_back(i);
            
            permu(cur, flag);
            
            cur.pop_back();
            flag[i] = false;
        }
    }
}
Using vector arrays
- Or you could just use vector right away.
void permu(vector<int> cur, vector<int> remain){
    if(remain.size() == 0) return;
    
    for(int i = 0; i < remain.size(); i++){
        cur.push_back(remain(i));
        remain.erase(remain.begin()+i, 1);
        
        permu(cur, remain);
        
        remain.insert(remain.begin()+i, cur.back());
        cur.pop_back();
    }
}
- but this one takes a lot of time since erase and insert takes O(N). Here’s a better one
void permu(vector<int> nums, int curIdx){
    if(curIdx == nums.size()) return;
    
    // try to write it down how it works, it helps
    // notice that 'i' is not 'curIdx+1'
    for(int i = curIdx; i < remain.size(); i++){
        swap(nums[i], nums[curIdx]);
        permu(nums, curIdx+1);
        swap(nums[curIdx], nums[i]);
    }
}
next_permutation
- And this one is just insane. C++ provides a function through a library <algorithm>. It’s just little tricky to use. (prev_permutation function also exists.)
- More explanation is here
// ref : http://www.cplusplus.com/reference/algorithm/next_permutation/
// next_permutation example
#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort
using namespace std;
int main () {
  int myints[] = {1,2,3};
    //sort is needed.
  sort (myints,myints+3);
  cout << "The 3! possible permutations with 3 elements:\n";
  do {
    cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
  } while ( next_permutation(myints,myints+3) );
  cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
  return 0;
}