欧美成人永久免费_欧美日本五月天_A级毛片免看在线_国产69无码,亚洲无线观看,精品人妻少妇无码视频,777无码专区,色大片免费网站大全,麻豆国产成人AV网,91视频网络,亚洲色无码自慰

當(dāng)前位置:網(wǎng)站首頁(yè) >> 作文 >> java中全排列是如何生成算法排序的通用

java中全排列是如何生成算法排序的通用

格式:DOC 上傳日期:2023-05-02 15:41:34
java中全排列是如何生成算法排序的通用
時(shí)間:2023-05-02 15:41:34     小編:zdfb

人的記憶力會(huì)隨著歲月的流逝而衰退,,寫(xiě)作可以彌補(bǔ)記憶的不足,,將曾經(jīng)的人生經(jīng)歷和感悟記錄下來(lái),也便于保存一份美好的回憶,。寫(xiě)范文的時(shí)候需要注意什么呢,?有哪些格式需要注意呢?下面我給大家整理了一些優(yōu)秀范文,,希望能夠幫助到大家,,我們一起來(lái)看一看吧。

java中全排列是如何生成算法排序的篇一

人生成長(zhǎng)語(yǔ)錄

推薦度:

java程序員年終總結(jié)

推薦度:

男生成熟的網(wǎng)名

推薦度:

java實(shí)訓(xùn)心得體會(huì)

推薦度:

考試反思總結(jié)全科

推薦度:

相關(guān)推薦

全排列的生成算法就是對(duì)于給定的字符集,,用有效的方法將所有可能的全排列無(wú)重復(fù)無(wú)遺漏地枚舉出來(lái),。任何n個(gè)字符集的排列都可以與1~n的n個(gè)數(shù)字的排列一一對(duì)應(yīng),因此在此就以n個(gè)數(shù)字的排列為例說(shuō)明排列的生成法,。

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

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

字典序法

遞增進(jìn)位數(shù)制法

遞減進(jìn)位數(shù)制法

鄰位交換法

遞歸類(lèi)算法

字典序法中,對(duì)于數(shù)字1,、2,、3......n的排列,不同排列的先后關(guān)系是從左到右逐個(gè)比較對(duì)應(yīng)的數(shù)字的先后來(lái)決定的,。例如對(duì)于5個(gè)數(shù)字的排列12354和12345,,排列12345在前,排列12354在后,。按照這樣的規(guī)定,,5個(gè)數(shù)字的所有的排列中最前面的是12345,最后面的是54321,。

字典序算法如下:

設(shè)p是1~n的一個(gè)全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn

1)從排列的右端開(kāi)始,,找出第一個(gè)比右邊數(shù)字小的數(shù)字的序號(hào)j(j從左端開(kāi)始計(jì)算),即 j=max{i|pi<pi+1}

2)在pj的右邊的數(shù)字中,,找出所有比pj大的數(shù)中最小的數(shù)字pk,,即 k=max{i|pi>pj}(右邊的數(shù)從右至左是遞增的,因此k是所有大于pj的數(shù)字中序號(hào)最大者)

3)對(duì)換pi,,pk

4)再將pj+1......pk-1pkpk+1pn倒轉(zhuǎn)得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,,這就是排列p的下一個(gè)下一個(gè)排列。

例如839647521是數(shù)字1~9的一個(gè)排列,。從它生成下一個(gè)排列的步驟如下:

自右至左找出排列中第一個(gè)比右邊數(shù)字小的數(shù)字4 839647521

在該數(shù)字后的數(shù)字中找出比4大的數(shù)中最小的一個(gè)5 839647521

將5與4交換 839657421

將7421倒轉(zhuǎn) 839651247

所以839647521的下一個(gè)排列是839651247,。

在遞增進(jìn)位制數(shù)法中,從一個(gè)排列求另一個(gè)排列需要用到中介數(shù),。如果用 ki表示排列p1p2...pi...pn中元素pi的右邊比pi小的數(shù)的個(gè)數(shù),,則排列的中介數(shù)就是對(duì)應(yīng)的排列k1 ...... ki...... kn-1。

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

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

得到中介數(shù)后,,可根據(jù)它還原對(duì)應(yīng)得排列,。

算法如下:

中介數(shù)k1、k2,、......,、kn-1的各位數(shù)字順序表示排列中的數(shù)字n、n-1,、......,、2在排列中距右端的的.空位數(shù),,因此,,要按k1、k2,、......,、kn-1的值從右向左確定n、n-1,、......,、2的位置,并逐個(gè)放置在排列中:i放在右起的ki+1位,如果某位已放有數(shù)字,,則該位置不算在內(nèi),,最后一個(gè)空位放1。

因此從67342300可得到排列849617523,,它就是839647521的后一個(gè)排列,。因?yàn)?最先放置,k1=6,,9放在右起第7位,空出6個(gè)空位,,然后是放8,,k2=7,8放在右起第8位,,但9占用一位,,故8應(yīng)放在右起第9位,余類(lèi)推,。

在遞增進(jìn)位制數(shù)法中,,中介數(shù)的最低位是逢2進(jìn)1,進(jìn)位頻繁,,這是一個(gè)缺點(diǎn),。把遞增進(jìn)位制數(shù)翻轉(zhuǎn),就得到遞減進(jìn)位制數(shù)。

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

給定中介數(shù),,可用與遞增進(jìn)位制數(shù)法類(lèi)似的方法還原出排列,。但在遞減進(jìn)位制數(shù)中,可以不先計(jì)算中介數(shù)就直接從一個(gè)排列求出下一個(gè)排列,。具體算法如下:

1)如果p(i)=n且i<>n,,則p(i)與p(i-1)交換

2)如果p(n)=n,則找出一個(gè)連續(xù)遞減序列9,、8,、......、i,將其從排列左端刪除,,再以相反順序加在排列右端,,然后將i-1與左邊的數(shù)字交換

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

鄰位對(duì)換法中下一個(gè)排列總是上一個(gè)排列某相鄰兩位對(duì)換得到的。以4個(gè)元素的排列為例,,將最后的元素4逐次與前面的元素交換,,可以生成4個(gè)新排列:

1 2 3 4, 1 2 4 3, 1 4 2 3, 4 1 2 3

然后將最后一個(gè)排列的末尾的兩個(gè)元素交換,再逐次將排頭的4與其后的元素交換,,又生成四個(gè)新排列:

4 1 3 2, 1 4 3 2, 1 3 4 2, 1 3 2 4

再將最后一個(gè)排列的開(kāi)頭的兩個(gè)元素交換,,將4從后往前移:

3 1 2 4, 3 1 4 2, 3 4 1 2, 4 3 1 2

如此循環(huán)4!次既可求出全部排列。

1)從原始排列p=p1p2......pn開(kāi)始,,第n位加n-1,,如果該位的值超過(guò)n,則將它除以n,,用余數(shù)取代該位,,并進(jìn)位(將第n-1位加1)

2)再按同樣方法處理n-1位,n-2位,,......,,直至不再發(fā)生進(jìn)位為止,處理完一個(gè)排列就產(chǎn)生了一個(gè)新的排列

3)將其中有相同元素的排列去掉

4)當(dāng)?shù)谝粋€(gè)元素的值>n則結(jié)束

以3個(gè)數(shù)1,、2,、3的排列為例:原始排列是1 2 3,從它開(kāi)始,,第3個(gè)元素是3,,3+2=5,5 mod 3=2,,第2個(gè)元素是2,,2+1=3,所以新排列是1 3 2,。通過(guò)元素增值,,順序產(chǎn)生的

排列是: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

有下劃線的排列中存在重復(fù)元素,,丟棄,,余下的就是全部排列。

全排列的生成方法用遞歸方式描述比較簡(jiǎn)潔,,實(shí)現(xiàn)的方法也有多種,。

1)回溯法

回溯法通常是構(gòu)造一顆生成樹(shù)。以3個(gè)元素為例,;樹(shù)的節(jié)點(diǎn)有個(gè)數(shù)據(jù),可取值是1,、2,、3,。如果某個(gè)為0,,則表示尚未取值。

初始狀態(tài)是(0,,0,,0),,第1個(gè)元素值可以分別挑選1,2,,3,,因此擴(kuò)展出3個(gè)子結(jié)點(diǎn)。用相同方法找出這些結(jié)點(diǎn)的第2個(gè)元素的可能值,,如此反復(fù)進(jìn)行,,一旦出現(xiàn)新結(jié)點(diǎn)的3個(gè)數(shù)據(jù)全非零,那就找到了一種全排列方案,。當(dāng)嘗試了所有可能方案,,即獲得了問(wèn)題的解答。

2)遞歸算法

如果用p表示n個(gè)元素的排列,,而pi表示不包含元素i的排列,,(i)pi表示在排列pi前加上前綴i的排列,那么,,n個(gè)元素的排列可遞歸定義為:

如果n=1,,則排列p只有一個(gè)元素i

如果n>1,則排列p由排列(i)pi構(gòu)成(i=1、2,、....,、n-1)。

根據(jù)定義,,容易看出如果已經(jīng)生成了k-1個(gè)元素的排列,,那么,k個(gè)元素的排列可以在每個(gè)k-1個(gè)元素的排列pi前添加元素i而生成,。例如2個(gè)元素的排列是1 2和2 1,,對(duì)與個(gè)元素而言,p1是2 3和3 2,,在每個(gè)排列前加上1即生成1 2 3和1 3 2兩個(gè)新排列,,p2和p3則是1 3、3 1和1 2,、2 1,,按同樣方法可生成新排列2 1 3、2 3 1和3 1 2,、3 2 1,。

3)循環(huán)移位法

如果已經(jīng)生成了k-1個(gè)元素的排列,則在每個(gè)排列后添加元素k使之成為k個(gè)元素的排列,,然后將每個(gè)排列循環(huán)左移(右移),,每移動(dòng)一次就產(chǎn)生一個(gè)新的排列。

例如2個(gè)元素的排列是1 2和2 1,。在1 2 后加上3成為新排列1 2 3,,將它循環(huán)左移可再生成新排列2 3 1、3 1 2,,同樣2 1 可生成新排列2 1 3,、1 3 2和3 2 1。

s("content_relate");

【java中全排列是如何生成算法】相關(guān)文章:

java算法實(shí)現(xiàn)排列組合的方法介紹

11-28

java中shuffle算法的使用

10-03

java如何生成驗(yàn)證碼呢

12-07

java中4大基本加密算法

10-01

java中什么是字段

10-05

權(quán)重隨機(jī)算法的java實(shí)現(xiàn)

12-02

java如何讀取jar中的資源

10-02

java實(shí)現(xiàn)生成guid的方法

12-04

java常見(jiàn)的排序算法的代碼

11-28

全文閱讀已結(jié)束,,如果需要下載本文請(qǐng)點(diǎn)擊

下載此文檔
a.付費(fèi)復(fù)制
付費(fèi)獲得該文章復(fù)制權(quán)限
特價(jià):5.99元 10元
微信掃碼支付
已付款請(qǐng)點(diǎn)這里
b.包月復(fù)制
付費(fèi)后30天內(nèi)不限量復(fù)制
特價(jià):9.99元 10元
微信掃碼支付
已付款請(qǐng)點(diǎn)這里 聯(lián)系客服