日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++语言基础 —— STL —— 算法 —— 排列组合算法

發(fā)布時間:2025/3/17 c/c++ 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++语言基础 —— STL —— 算法 —— 排列组合算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【概述】

首先要了解什么是 “下一個” 排列組合,什么是 “上一個” 排列組合。

假設(shè)有三個數(shù)字組成的序列:{a,b,c}

則這個序列有6種可能的排列組合:abc、acb、bac、bca、cab、cba

上述的排列組合是根據(jù) less-than 操作符做字典順序的排序,即:abc 處于第一,每一個元素都小于其后的元素,而 acb 是次一個排列組合,它是固定了序列內(nèi)最小元素( a )之后所做的新組合。

同理,序列中次小元素( b )而做的排列組合,在次序上將先于那些固定最小元素( c )而做的排列組合,以 bac、bca 為例,bac 在 bca 之前,因為次序 ac 小于序列 ca ,因此,對于 bca,可以說其前一個排列組合是 bac,其后一個排列組合是 cab。

要注意的是,處于排列首的序列 abc 沒有 “前一個” 排列組合,處于排列尾的序列 cba 沒有“后一個”排列組合。

【STL 中提供的算法】

STL 提供了兩個用來計算排列組合關(guān)系的算法,分別是 next_permutation() 與 prev_permutation()

其中,next_permutation()?是取出當(dāng)前范圍內(nèi)的排列,并重新排序為下一個排列,prev_permutation() 是取出指定范圍內(nèi)的序列并將它重新排序為上一個序列。如果不存在下一個序列或上一個序列則返回 false,否則返回 true

這個算法有兩個版本,其一使用元素類別所提供的操作符來決定下一個或上一個排列組合,其二是以仿函數(shù) comp 來決定

1.算法思想

以?next_permutation() 為例:

  • 從最尾端開始向前尋找兩個相鄰的元素,令第一元素為 *i,第二元素為 *ii,且滿足 *i<*ii
  • 找到上述的一組相鄰元素后,從最尾端向前檢驗,找出第一個大于 *i 的元素,令其為 *j,然后將 i、j 元素交換
  • 再將 ii 之后的所有元素顛倒排序
  • 假設(shè)存在序列{0,1,2,3,4},下圖即為尋找全排列的過程

    2.next_permutation() 的用法

    對于給定的任意一種排列組合,如果能求出下一個排列的情況,那么求得所有全排列情況就容易了。

    利用 next_permutation() 的返回值,通過判斷排列是否結(jié)束,即可求出全排列。

    int a[N]; void all_permutation(int n) {sort(a,a+n);do{for(int i=0; i<n; i++)printf("%d ",a[i]);printf("\n");}while(next_permutation(a,a+n)); }

    3.next_permutation() 與?prev_permutation() 的區(qū)別

    next_permutation()?函數(shù)默認(rèn)的是從小到大的順序,而 prev_permutation() 函數(shù)默認(rèn)的是從大到小的順序。

    例如:對于序列 {3,1,2}

    用 next_permutation()?函數(shù)得到的結(jié)果是:312、321

    用?prev_permutation() 函數(shù)得到的結(jié)果是:312、231、213、132、123

    ?

    總結(jié)

    以上是生活随笔為你收集整理的C++语言基础 —— STL —— 算法 —— 排列组合算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。