Permutations and Combinations

基本概念以及生成下一个排列、组合的算法整理。
参考:Discrete mathematics and its applications

Basic Using

Permutation

  • permutation : an ordered arrangement of the elements of a set
  • r-permutation : an ordered arrangement of r elements of a set
  • The number of r-permutations of a set with n distinct elements is P(n, r) = n(n-1)(n-2)…(n-r+1) = n!/(n-r)!

Permutations With Repetition

  • The number of r-permutations of a set of n objects with repetition allowed is n^r

Permutations of Sets With Indistinguishable Objects

  • Consider the situation: n-Permutation with limited repetition, A = { n1*a1 ,n2*a2 ,…,nk*ak },where n1+n2+…+nk = n. The number of different permutations of n objects, where there are n1 indistinguishable objects of type1,…,and nk indistinguishable objects of type k, is n!/(n1!n2!…nk!)

Combitation

  • r-combination : an unordered selection of r elements of a set
  • The number of r-combination of a set with n elements is C(n, r) = n(n-1)(n-2)…(n-r+1)/r! = n!/(n-r)!/r!
  • Let n and r be nonnegative integers with r <= n. Then C(n ,r) = C(n, n-r)

Combination With Repetition

  • There are C (n-1+r, r) r-combination from a set with n elements when repetition of elements is allowed.

  • Proof : 从n个不同的元素中选出r个可重复元素的排列,可以看成:用n-1个竖线,分隔开r个元素的问题,比如 * * | * | * 代表从3个不同的元素中选出4个元素。所以问题就转换成n-1 + r个位置中选n-1个作为竖线,其他r个作为元素。就是C(n-1+r,n-1) = C(n-1+r,r)

Generating Permutations and Combinations

Generating Permutations

  • Algorithm of producing the n! permutations of the integers 1, 2, …, n:
  1. Begin with the smallest permutation in lexicographic order, namely 1, 2, 3, 4,…, n.
  2. Produce the next largest permutation.
  3. Continue until all n! permutations have been found.
  • Given permutation a1,a2,…,an, find the next largest permutation in increasing order:
  1. Find the integers aj,aj+1 with aj < aj+1 and aj+1 > aj+2 > ... > an
  2. Put in the jth position the least integer among aj+1,aj+2,...,an that is greater than aj
  3. List in increasing order the rest of the integers aj,aj+1,...,an

For example, the next largest permutation in lexicographic order after 124653 is 125346.

Implementation

#include <iostream>
#include <vector>
#include <algorithm>

using std::cout;
using std::endl;
using std::vector;
using std::reverse;
using std::cin;

namespace m{
template <typename _BidirectionalIterator>
struct compare_func {
    bool operator()(_BidirectionalIterator l, _BidirectionalIterator r) const noexcept {
        return *l < *r;
    }
};

template <typename _BidirectionalIterator>
struct swap_func {
    void operator()(_BidirectionalIterator l, _BidirectionalIterator r) const noexcept {
        auto tmp = *l;
        *l = *r;
        *r = tmp;
    }
};


template <
    typename _BidirectionalIterator,
    typename _Compare = compare_func<_BidirectionalIterator>,
    typename _Swap = swap_func<_BidirectionalIterator>
>
bool next_permutation(
        _BidirectionalIterator first, 
        _BidirectionalIterator last, 
        _Compare comp = compare_func<_BidirectionalIterator>(),
        _Swap swap = swap_func<_BidirectionalIterator>()){
    if (first == last) {
        return false;
    }
    auto it1 = first;
    ++it1;
    if (it1 == last) {
        return false;
    }
    it1 = last;
    --it1;
    decltype(it1) it2;
    while(it1 != first) {
        it2 = it1;
        --it2;
        if (comp(it2, it1)) {
            auto it3 = last;
            while(!comp(it2,--it3)) {
            }
            swap(it2, it3);
            reverse(it1, last);
            return true;
        }else{
            --it1;
        }
    }
    reverse(first, last);
    return false;
}
}


int main(int argc, char** argv) {
    auto dump = [](auto b, auto e) -> void{
        for(auto i=b;i!=e;i++){
            cout<<*i<<" ";
        }
        cout<<endl;
    };
    int n;
    cin>>n;
    vector<int> arr;
    for(int i =1;i<=n;i++){
        arr.push_back(i);
    }
    while(m::next_permutation(arr.begin(),arr.end())) {
        dump(arr.begin(),arr.end());
    }
    dump(arr.begin(), arr.end());
}


Generating Combinations

How to generate all combinations of the elements of a finite set ?
A combination is just a subset. Use bit strings of length n to represent a subset of a set with n elements. So we need to list all bit strings of length n.

  • Algorithm of Producing All Bit Strings of length n
  1. Start with the bit string 000…00,with n zeros.
  2. Then, successively find the next largest expansion until the bit string 111…11 is obtained.
  • Algorithm of finding the next largest binary expansion

Locate the first position from the right that is not a 1, then changing all the 1s to the right of this position to 0s and making this first 0 a 1.(实际上就是加一)

For example: 1000110011 -> 1000110100

  • Algorithm for generating the r-combination of the set {1, 2, …, n}
  1. S1 = {1, 2, …, r}
  2. If Si = {a1,a2,...,ar} 1<=i<=C(n,rh-1) has found, then the next combination can be obtained using the following rules: First, locate the last element ai in the sequence such that ai != n-r+i. Then replace ai with ai + 1 and aj with ai + j - i + 1, for j = i+1,i+2,...,r.

For example: Si ={2,3,5,6,9,10} is given.Then Si+1 ={2,3,5,7,8,9}.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 文/梨若 每个人都有自己的生活,或明亮,或灰暗,终究靠自己去探索。 上午的时候,阳光特别好。在楼上透过窗户看到外面...
    梨若阅读 471评论 1 1
  • 我们组队吧 对于高中的我们来说,考试是最轻松的事了,因为考试时很多休息时间。一天考两门,晚自习也是在教室自由复习。...
    陶泉阅读 176评论 0 0
  • 黑夜终将逝去, 光明也无永久。 乌纱轻遮白玉, 灯火已尽阑珊。 回眸, 可无怅惘? 移目, 几点流珠? 路为己选,...
    流风慵云阅读 395评论 0 4
  • Feira阅读 178评论 0 1
  • 红楼梦里最喜欢的就是黛玉。看书的时候,总是不由得在脑海里想她一颦一笑,一嗔一怒。 她是个有七窍玲珑心的女子,只是宝...
    温白M阅读 1,396评论 2 2