亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java中全排列的生成算法匯總

2019-11-26 15:04:20
字體:
來源:轉載
供稿:網友

  全排列的生成算法就是對于給定的字符集,用有效的方法將所有可能的全排列無重復無遺漏地枚舉出來。任何n個字符集的排列都可以與1~n的n個數字的排列一一對應,
  因此在此就以n個數字的排列為例說明排列的生成法。

  n個字符的全體排列之間存在一個確定的線性順序關系。所有的排列中除最后一個排列外,都有一個后繼;除第一個排列外,都有一個前驅。每個排列的后繼都可以從它的前驅經過最少的變化而得到,全排列的生成算法就是從第一個排列開始逐個生成所有的排列的方法。

  全排列的生成法通常有以下幾種:

  字典序法
  遞增進位數制法
  遞減進位數制法
  鄰位交換法
  遞歸類算法

1.字典序法 效率高且順序自然

  字典序法中,對于數字1、2、3......n的排列,不同排列的先后關系是從左到右逐個比較對應的數字的先后來決定的。例如對于5個數字的排列12354和12345,排列12345在前,排列12354在后。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最后面的是54321。

  字典序算法如下:

  設P是1~n的一個全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
  1)從排列的右端開始,找出第一個比右邊數字小的數字的序號j(j從左端開始計算),即 j=max{i|pi<pi+1}
  2)在pj的右邊的數字中,找出所有比pj大的數中最小的數字pk,即 k=max{i|pi>pj}(右邊的數從右至左是遞增的,因此k是所有大于pj的數字中序號最大者)
  3)對換pi,pk
  4)再將pj+1......pk-1pkpk+1pn倒轉得到排列p''=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下一個下一個排列。

  例如839647521是數字1~9的一個排列。從它生成下一個排列的步驟如下:
  自右至左找出排列中第一個比右邊數字小的數字4 839647521
  在該數字后的數字中找出比4大的數中最小的一個5 839647521
  將5與4交換 839657421
  將7421倒轉 839651247
  所以839647521的下一個排列是839651247。

2.遞增進位數制法

  在遞增進位制數法中,從一個排列求另一個排列需要用到中介數。如果用 ki表示排列p1p2...pi...pn中元素pi的右邊比pi小的數的個數,則排列的中介數就是對應的排列k1 ...... ki...... kn-1。

  例如排列839647521的中介數是72642321,7、2、6、......分別是排列中數字8、3、9、......的右邊比它小的數字個數。

  中介數是計算排列的中間環節。已知一個排列,要求下一個排列,首先確定其中介數,一個排列的后繼,其中介數是原排列中介數加1,需要注意的是,如果中介數的末位kn-1+1=2,則要向前進位,一般情形,如果ki+1=n-i+1,則要進位,這就是所謂的遞增進位制。例如排列839647521的中介數是72642321,則下一個排列的中介數是67342221+1=67342300(因為1+1=2,所以向前進位,2+1=3,又發生進位,所以下一個中介數是67342300)。

得到中介數后,可根據它還原對應得排列。

  算法如下:

  中介數k1、k2、......、kn-1的各位數字順序表示排列中的數字n、n-1、......、2在排列中距右端的的空位數,因此,要按k1、k2、......、kn-1的值從右向左確定n、n-1、......、2的位置,并逐個放置在排列中:i放在右起的ki+1位,如果某位已放有數字,則該位置不算在內,最后一個空位放1。
 
  因此從67342300可得到排列849617523,它就是839647521的后一個排列。因為9最先放置,k1=6,9放在右起第7位,空出6個空位,然后是放8,k2=7,8放在右起第8位,但9占用一位,故8應放在右起第9位,余類推。

3.遞減進位制數法

  在遞增進位制數法中,中介數的最低位是逢2進1,進位頻繁,這是一個缺點。把遞增進位制數翻轉,就得到遞減進位制數。

  839647521的中介數是67342221(k1k2...kn-1),倒轉成為12224376(kn-1...k2k1),這是遞減進位制數的中介數:ki(i=n-1,n-2,...,2)位逢i向ki-1位進1。給定排列p,p的下一個排列的中介數定義為p的中介數加1。例如p=839647521,p的中介數為12224376,p的下一個排列的中介數為12224376+1=12224377,由此得到p的下一個排列為893647521。

  給定中介數,可用與遞增進位制數法類似的方法還原出排列。但在遞減進位制數中,可以不先計算中介數就直接從一個排列求出下一個排列。具體算法如下:
  1)如果p(i)=n且i<>n,則p(i)與p(i-1)交換
  2)如果p(n)=n,則找出一個連續遞減序列9、8、......、i,將其從排列左端刪除,再以相反順序加在排列右端,然后將i-1與左邊的數字交換

  例如p=893647521的下一個排列是983647521。求983647521的下一個排列時,因為9在最左邊且第2位為8,第3位不是7,所以將8和9從小到大排于最右端364752189,再將7與其左方數字對調得到983647521的下一個排列是367452189。又例如求987635421的下一個排列,只需要將9876從小到大排到最右端并將5與其左方數字3對調,得到534216789。

4.鄰位對換法 效率最高但順序不自然

  鄰位對換法中下一個排列總是上一個排列某相鄰兩位對換得到的。以4個元素的排列為例,將最后的元素4逐次與前面的元素交換,可以生成4個新排列:
  1 2 3 4, 1 2 4 3, 1 4 2 3, 4 1 2 3
  然后將最后一個排列的末尾的兩個元素交換,再逐次將排頭的4與其后的元素交換,又生成四個新排列:
  4 1 3 2, 1 4 3 2, 1 3 4 2, 1 3 2 4
  再將最后一個排列的開頭的兩個元素交換,將4從后往前移:
  3 1 2 4, 3 1 4 2, 3 4 1 2, 4 3 1 2
  如此循環4!次既可求出全部排列。

5.元素增值法(n進制法)效率低

  1)從原始排列p=p1p2......pn開始,第n位加n-1,如果該位的值超過n,則將它除以n,用余數取代該位,并進位(將第n-1位加1)
  2)再按同樣方法處理n-1位,n-2位,......,直至不再發生進位為止,處理完一個排列就產生了一個新的排列
  3)將其中有相同元素的排列去掉
  4)當第一個元素的值>n則結束
  以3個數1、2、3的排列為例:原始排列是1 2 3,從它開始,第3個元素是3,3+2=5,5 Mod 3=2,第2個元素是2,2+1=3,所以新排列是1 3 2。通過元素增值,順序產生的
  排列是:1 2 3,1 3 2,2 1 1,2 1 3,2 2 2,2 3 1,2 3 3,3 1 2,3 2 1
  有下劃線的排列中存在重復元素,丟棄,余下的就是全部排列。

6.遞歸類算法

  全排列的生成方法用遞歸方式描述比較簡潔,實現的方法也有多種。

  1)回溯法
  回溯法通常是構造一顆生成樹。以3個元素為例;樹的節點有個數據,可取值是1、2、3。如果某個為0,則表示尚未取值。
  初始狀態是(0,0,0),第1個元素值可以分別挑選1,2,3,因此擴展出3個子結點。用相同方法找出這些結點的第2個元素的可能值,如此反復進行,一旦出現新結點的3個數據全非零,那就找到了一種全排列方案。當嘗試了所有可能方案,即獲得了問題的解答。

  2)遞歸算法
  如果用P表示n個元素的排列,而Pi表示不包含元素i的排列,(i)Pi表示在排列Pi前加上前綴i的排列,那么,n個元素的排列可遞歸定義為:
  如果n=1,則排列P只有一個元素i
  如果n>1,則排列P由排列(i)Pi構成(i=1、2、....、n-1)。
  根據定義,容易看出如果已經生成了k-1個元素的排列,那么,k個元素的排列可以在每個k-1個元素的排列Pi前添加元素i而生成。例如2個元素的排列是1 2和2 1,對與個元素而言,p1是2 3和3 2,在每個排列前加上1即生成1 2 3和1 3 2兩個新排列,p2和p3則是1 3、3 1和1 2、2 1,按同樣方法可生成新排列2 1 3、2 3 1和3 1 2、3 2 1。

  3)循環移位法
  如果已經生成了k-1個元素的排列,則在每個排列后添加元素k使之成為k個元素的排列,然后將每個排列循環左移(右移),每移動一次就產生一個新的排列。
  例如2個元素的排列是1 2和2 1。在1 2 后加上3成為新排列1 2 3,將它循環左移可再生成新排列2 3 1、3 1 2,同樣2 1 可生成新排列2 1 3、1 3 2和3 2 1。

意思所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频综合网| 久久免费视频网| 日韩高清电影免费观看完整版| 亚洲欧洲一区二区三区在线观看| 98精品国产高清在线xxxx天堂| 色青青草原桃花久久综合| 日韩视频在线免费| 欧美激情第99页| 亚洲色图偷窥自拍| 91精品国产综合久久香蕉最新版| 国产成人精品优优av| 日本精品免费一区二区三区| 亚洲男人天堂网站| 久久亚洲国产精品成人av秋霞| 91精品久久久久久久久青青| 欧美性猛交99久久久久99按摩| 日韩国产欧美精品在线| 国产精品户外野外| 国产精品亚洲视频在线观看| 久久精品国产一区二区三区| 久久激情视频免费观看| 国模gogo一区二区大胆私拍| 日韩在线视频观看| 欧美精品在线免费| 亚洲色图综合久久| 国产精品都在这里| 国产成人精品久久亚洲高清不卡| 亚洲福利小视频| 久久久久久久爱| 国产精品日韩在线观看| 91免费欧美精品| 欧美国产视频日韩| 国产成人精品a视频一区www| 亚洲欧美日韩国产精品| 亚洲女人天堂网| www.国产精品一二区| 97人人做人人爱| 欧美亚洲一级片| 国产精品久久久久久婷婷天堂| 日韩高清人体午夜| 97色在线视频观看| 丰满岳妇乱一区二区三区| 精品成人久久av| 亚洲最大的成人网| 成人深夜直播免费观看| 蜜臀久久99精品久久久久久宅男| 亚洲电影免费观看| 午夜精品久久久久久久久久久久| 欧美在线一区二区三区四| 国产精品v日韩精品| 成人精品视频在线| 久久人人爽人人爽人人片av高请| 日韩不卡在线观看| 国产网站欧美日韩免费精品在线观看| 国产一区二区在线免费视频| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲综合在线小说| 亚洲天堂第二页| 欧美性开放视频| 91中文精品字幕在线视频| 日本视频久久久| 在线丨暗呦小u女国产精品| www.日本久久久久com.| 国产免费一区视频观看免费| 欧美日韩在线第一页| 欧美一级免费看| 亚洲香蕉成视频在线观看| 日韩精品免费在线播放| 午夜欧美大片免费观看| 亚洲欧美国产日韩天堂区| 91精品综合久久久久久五月天| 亚洲精品资源美女情侣酒店| 亚洲第一偷拍网| 国产精品美女av| 日本成人免费在线| 欧美激情亚洲综合一区| 久久亚洲精品小早川怜子66| 精品动漫一区二区| 国产亚洲美女精品久久久| 久久精品国产视频| 中国china体内裑精亚洲片| 久久青草精品视频免费观看| 亚洲欧美中文字幕在线一区| 久久精品一本久久99精品| 欧美激情欧美激情| 国产精品草莓在线免费观看| 亚洲精品动漫100p| 中文字幕欧美专区| 亚洲аv电影天堂网| 久久久久久尹人网香蕉| 精品国偷自产在线视频99| 久久99国产综合精品女同| 欧美精品18videos性欧| 777午夜精品福利在线观看| 色综久久综合桃花网| 成人激情视频在线观看| 2018国产精品视频| 久久久免费精品| 亚洲性线免费观看视频成熟| 亚洲国产小视频在线观看| 精品日韩美女的视频高清| 欧美俄罗斯乱妇| 黑人巨大精品欧美一区二区免费| 久久久久久久久久久网站| 精品国产91久久久| 欧美精品videossex88| 美女扒开尿口让男人操亚洲视频网站| 91免费国产视频| 亚洲剧情一区二区| 国产精品久久久久一区二区| 在线播放国产一区中文字幕剧情欧美| 国产日韩欧美在线播放| 在线看日韩av| 中文字幕日韩精品在线| 成人做爽爽免费视频| 亚洲天堂网在线观看| 2024亚洲男人天堂| 日韩成人在线网站| 狠狠色噜噜狠狠狠狠97| 欧美超级乱淫片喷水| 色综合老司机第九色激情| 日韩av免费在线播放| 亚洲国产精品久久久久久| www国产亚洲精品久久网站| 成人免费视频97| 伊人成人开心激情综合网| 久久久久久久一| 欧美性xxxx在线播放| 欧美日韩xxxxx| 亚洲欧美精品一区二区| 按摩亚洲人久久| 亚洲精品免费一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 91av在线免费观看视频| 亚洲综合成人婷婷小说| 国产精品精品久久久久久| 国产成人aa精品一区在线播放| 欧美怡春院一区二区三区| 日韩精品在线视频观看| 久久精品视频99| 亚洲va久久久噜噜噜| 国产精品欧美激情在线播放| 欧美裸体视频网站| 国产一区二区三区精品久久久| 亚洲成年网站在线观看| 亚洲成人精品视频在线观看| 在线观看91久久久久久| 欧美在线视频网| 97视频网站入口| 欧美巨大黑人极品精男| 亚洲精品自拍偷拍| 欧美大胆在线视频| 国产精品∨欧美精品v日韩精品| 91极品视频在线| 久久99精品久久久久久噜噜| 久久视频国产精品免费视频在线| 亚洲天堂免费在线| 国产精品入口夜色视频大尺度| 欧美日韩免费在线观看| 亚洲aⅴ日韩av电影在线观看| 国产亚洲欧美视频| 久久中文久久字幕| 日本道色综合久久影院| 91久久久久久|