好久沒有更新了,今天來更新一下。
今天來說一下關於全排列的問題
那么第一個問題,什么是全排列?
全排列可以理解為,數學里面的排列組合
更簡單的說呢,就是,從一到n這n個數有多少種排列情況?
當然,答案顯而易見,就是: n的階乘當然,n的階乘肯定不是今天要討論的東西
今天我們要討論的就是如何把這n的階乘種情況給表示出來
那么下面我們切入正題開始分析如何生成全排列?
我們先看第一位的情況,他有n個數,從一到n那么開頭的情況肯定是n種,123直到n
當然,因為開頭是1,所以一的時候就不用多說,對吧?
然后下面就要分出2開頭,3開頭到n開頭的情況,對吧?那么怎么生成這種情況呢?就是拿1和2和3和4到n依次換位(1開頭可以理解為1和自己交換)
這樣第一位的情況就考慮完了,對吧?下面我們考慮第二位,第二位其實也是這樣,考慮第二位自己不變,第二位和后面的換和(后面的后面)的換....
更直接的說就是第一位已經確定假設是1,后面還有n-1個數,第二位可能是2,可能是3,可能是....n,那么久,等同於拿2和自己換位和3換位和4換位到和n換位
那么,我這樣往下分析下去,直到就是說第n-1位和第一個n位換位。下面就沒有分叉了
意思就是說我們要在,第一位不換位的情況下去考慮,用第二位和自己換位和第三位和第四位,直到第n位,這些情況,然后再這些情況的每一種情況下再去考慮分叉出的情況,依次往下,直到考慮到第n-1位和,第n位換位
因為每一種情況下面都會分出各種情況,而各種情況之后,又會分出各種情況,那么,我們再具體說些細節問題
也就是說,考慮到某一種情況,一直往下延伸,直到無法往下延伸的某一種情況的時候,也就是說,對n-1為和dn位換位之后,此時我們會生成一個新的排列,這就是全排列中的一種情況,由於我們生成此排列的時候,對dny和an-1為進行了換位,由於我們要保證生成其他排列時,他們的順序和本序列生成所面對的序列情況相同,我們輸出這個新的排列,也就是剛才我們所說的一個排列突出之后呢,我們要把它換回來,這里稱之為,回朔
這樣才能保證全排列的全
OK
下面我們來看代碼
這里用Java來編碼
import java.util.Scanner; public class Permutation { public static int count = 0; public static void main(String[] argv) { Scanner in =new Scanner(System.in); int N = in.nextInt();//輸入N 這里用於輸出1到N的全排列 int[] key = new int[N]; for(int i=0;i<key.length;i++){ key[i]=i+1; } check(0,key,N); } public static void check(int n,int[] a,int N){//換位函數 int i; if(n==N){//符合條件輸出 Put(a); } for(i=n;i<N;i++){ int x=a[n]; a[n]=a[i]; a[i]=x; check(n+1,a,N);//考慮下面分叉 x=a[n]; a[n]=a[i];//回溯 a[i]=x; } } public static void Put(int[] a){//輸出函數 int i; for (i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } }
上面就是代碼
下面我們看示例輸出
太大的數呢
輸出太長
就不展示了
主要是理解這個思路
因為很多算法題明里暗里都會用到全排列的計算
OK 這次更新就到這