全排列構造方法1——o(n2*n!)
先看看這樣的數學式子:
n!=n*(n-1)!=(n-1)*(n-1)!+(n-1)!
=(n-1)*(n-1)!+(n-2)*(n-2)!+(n-2)!
=…….
=(n-1)*(n-1)!+(n-2)*(n-2)!+…+2*2!+1*1!+1
即有 n!-1=(n-1)*(n-1)!+(n-2)*(n-2)!+…+2*2!+1*1!
對於任意的0至n!-1之間的整數都可以表示為:
an-1*(n-1)!+an-2*(n-2)!+…+a2*2!+a1*1!
其中任一相加項都可表示為aj*j!(1<=j<=n-1)。
對於4而言,用乙個變數a3來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~3之間;
對於3而言,用乙個變數a2來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~2之間;
對於2而言,用乙個變數a1來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~1之間;
而1比其它數都小,只要其它數字定了,它的位置也就定了。
這樣對於1到4任一排列都可以根據各個數字的位置描述成a3 a2 a1 ,讓a3 a2 a1跟乙個數對應起來,這個數就是a3*3!+a2*2!+a1*1!。
這樣可以通過乙個迴圈(從0到n!-1)來控制輸出n!種排列。
以n=4,從0開始的第15個全排列為例,先將15轉換為a3*3!+a2*2!+a1*1!這種形式:
15 div 3!=2,a3=2,表示4的右邊比它小的數的個數為2,說明4在從左向右的第2位;
15 mod 3!=3,3 div 2!=1;a2=1,表示3的右邊比它小的數的個數為1,說明3在從左向右的第3位;
3 mod 2!=1,1 div 1!=1;a1=1,表示2右邊比它小的數的個數為1,說明3在從左向右的第4位;
4、3、2的位置都確定了,1只能在剩下的空位置上,說明15對應的全排列為1432。
[演算法描述]:
1.對於輸入的n,求出1!、2!,……,n!。
2.i從0到n!-1重複做以下的內容:
(1)將i表示成an-1*(n-1)!+an-2*(n-2)!+…+a2*2!
+a1*1!的形式:先用變數記住i的值即j:
=i,然後k從n-1到1重複做:a[k]:=j div k!
; j:=j mod k!
(2)j從n-1到1依次根據a[j]的值來填j+1,從低位向高位(對應從右向左順序)找非0位置個數直到等於a[j]+1,這個位置記為k,表示已找好右邊比當前所填數小的個數a[j],則第k位置應填j+1。
(3)輸出各個位置的值。
全排列構造方法2——o(n*n!)
當n=4時的排列:
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
從上面的排列可以發現以下的規律:
(1)偶數序列是由奇數序列的最後兩位交換而來,如1234的最後兩位交換後為1243,4123的最後兩位交換後為4132;
(2)除第乙個排列1234是給定的外,其它奇數排列也可由前乙個偶數序列通過以下的交換得來:對前乙個序列從第乙個數字開始找出比左邊數大的最右數,如1243為4,這個數所在的位置記為i,1243的i=3,然後再從第i個數開始找比第i-1個數大的最右數,1243為3,它的位置記為j,1243的j=4,交換a[i-1]與a[j],此時1243變為1342,跟1324不同的是從第i位直到第n位順序相反,因此對第i位到第n位進行逆序處理則得到結果;
(3)將交換規律(2)同樣對奇數序列作處理,也能得到正確的偶數序列,結果一樣,因此可以統一成乙個交換規律,即將(1)和(2)統一成(2);
交換到什麼時候結束呢?當已是完全由大到小時(i=1),則完成了交換構造。
[演算法描述]:
(1)1、2……n依次賦給a[1]至a[n],輸出第一種排列;
(2)構造下一種全排列,分四步完成:
第一步,i的初值為1,在a[1]至a[n]中搜尋找出相應的i,使i是a[k]>a[k-1]的k中最大的,即i=max;
第二步,在a[1]至a[n]中搜尋找出相應的j,使j是a[k]>a[i-1]的k中最大的,即j=max;
第三步,交換a[i-1]與a[j]形成新的序列;
第四步,對新的序列從 a[i+1]……a[n]進行逆序處理,輸出相應序列。
(3)重複(2)直到i=1時結束
排列句子的方法
一 粗讀知大意。將句子粗略地讀一遍,了解整個句子的意思。如 誰做什麼?誰怎麼樣?說了件什麼事?介紹了什麼 這樣能使我們把握住排列時的總方向。二 細讀找順序。仔細地讀幾遍,根據其意找出是按什麼順序寫的 如事情的發展順序 時間順序 方位順序 仔細地尋找句子中相關的詞語來確定順序。三 精讀巧排列。我們讀句...
排列句子的方法
一 按事情發展的順序排列有些錯亂的句子,我們在排列時,應仔細分析句與句之間的聯絡。常見的錯亂句子,往往敘述了一件完整的事,或者活動的具體過程。那麼,我們就可以按事情發展的順序來排列。如,他想,這是誰丟的,真不講衛生。他看見地上有一團白白的東西。忽然,他看見有幾個小同學在打掃操場,爭做好事。下課了,張...
排列句子方法指導
一 按事情發展順序排列 有些錯亂的句子,我們在排列時,應仔細分析句與句之間的聯絡。常見的錯亂句子,往往敘述了一件完整的事,或者活動的具體過程。那麼,我們就可以按事情發展的順序來排列。如 他想,這是誰丟的,真不講衛生。他看見地上有一團白白的東西。忽然,他看見有幾個小同學在打掃操場,爭做好事。下課了,張...