當前位置:首頁 » 操作系統 » 圈排列演算法

圈排列演算法

發布時間: 2022-11-01 12:18:25

㈠ 關於全排列演算法實現(請幫忙注釋這些代碼)

全排列用的是
置換演算法,
演算法這東西重在理解。具體代碼並不那麼重要。
全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n!個。現以{1,
2,
3,
4,
5}為
例說明如何編寫全排列的遞歸演算法。
1、首先看最後兩個數4,
5。
它們的全排列為4
5和5
4,
即以4開頭的5的全排列和以5開頭的4的全排列。
由於一個數的全排列就是其本身,從而得到以上結果。
2、再看後三個數3,
4,
5。它們的全排列為3
4
5、3
5
4、
4
3
5、
4
5
3、
5
3
4、
5
4
3
六組數。
即以3開頭的和4,5的全排列的組合、以4開頭的和3,5的全排列的組合和以5開頭的和3,4的全排列的組合.
從而可以推斷,設一組數p
=
{r1,
r2,
r3,
...
,rn},
全排列為perm(p),pn
=
p
-
{rn}。
因此perm(p)
=
r1perm(p1),
r2perm(p2),
r3perm(p3),
...
,
rnperm(pn)。當n
=
1時perm(p}
=
r1。
為了更容易理解,將整組數中的所有的數分別與第一個數交換,這樣就總是在處理後n-1個數的全排列。
演算法如下:
#include
<stdio.h>
int
n
=
0;
void
swap(int
*a,
int
*b)
{
int
m;
m
=
*a;
*a
=
*b;
*b
=
m;
}
void
perm(int
list[],
int
k,
int
m)
{
int
i;
if(k
>
m)
{
for(i
=
0;
i
<=
m;
i++)
printf("%d
",
list[i]);
printf("\n");
n++;
}
else
{
for(i
=
k;
i
<=
m;
i++)
{
swap(&list[k],
&list[i]);
perm(list,
k
+
1,
m);
swap(&list[k],
&list[i]);
}
}
}
int
main()
{
int
list[]
=
{1,
2,
3,
4,
5};
perm(list,
0,
4);
printf("total:%d\n",
n);
return
0;
}

㈡ 如何生成一串數字的全排列 演算法

個人一點見解,希望對你有所幫助。
依我之見,你的對換部分出了一點點問題。只要作如下修改即可:
1、exchange 改為:
procere exchange(l,r:integer);
var
t,len:integer;
begin
if l=r then exit;
len:=r-l+1;
len:=len div 2;
for i:=1 to len do
begin
t:=a[l+i-1];
a[l+i-1]:=a[r-i+1];
a[r-i+1]:=t;
end;
end;
2、主過程中exchange(p,n)改為exchange(i+1,n)。

㈢ 全排列的公式

全排列數f(n)=n!(定義0!=1) 1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
這是由於演算法只是考慮到了如何輸出全排列,而沒有考慮到換位是否有問題。
所以我提出了解決方案,就是換位函數修改下
如 1 2 3 換位的話 ,不應該直接 3 2 1這樣 ,
讓3和1直接換位; 而是讓3排在最前後 ,1 2 依次向後 以下介紹全排列演算法四種:
(A)字典序法
(B)遞增進位制數法
(C)遞減進位制數法
(D)鄰位對換法 對給定的字元集中的字元規定了一個先後關系,在此基礎上規定兩個全排列的先後是從左到右逐個比較對應的字元的先後。
[例]字元集{1,2,3},較小的數字較先,
這樣按字典序生成的全排列是:123,132,213,231,312,321。
[注意] 一個全排列可看做一個字元串,字元串可有前綴、後綴。
1)生成給定全排列的下一個排列 所謂一個的下一個就是這一個與下一個之間沒有其他的。這就要求這一個與下一個有盡可能長的共同前綴,也即變化限制在盡可能短的後綴上。
[例]839647521是1--9的排列。
1—9的排列最前面的是123456789,最後面的是987654321,從右向左掃描若都是增的,就到987654321,也就沒有下一個了。否則找出第一次出現下降的位置。 1)由排列求中介數 在字典序法中,中介數的各位是由排列數的位決定的.中介數位的下標與排列的位的下標一致。
在遞增進位制數法中,中介數的各位是由排列中的數字決定的。即中介數中各位的下標與排列中的數字(2—n)一致。可看出n-1位的進位鏈。 右端位逢2進1,右起第2位逢3進1,…,
右起第i位逢i+1進1,i=1,2,…,n-1. 這樣的中介數我們稱為遞增進位制數。 上面是由中介數求排列。
由序號(十進制數)求中介數(遞增進位制數)如下:
m=m1,0≤m≤n!-1
m1=2m2+kn-1,0≤kn-1≤1
m2=3m3+kn-2,0≤kn-2≤2
……………
mn-2=(n-1)mn-1+k2,0≤k2≤n-2
mn-1=k1,0≤k1≤n-1
p1p2…pn←→(k1k2…kn-1)↑←→m
在字典序法中由中介數求排列比較麻煩,我們可以通過另外定義遞增進位制數加以改進。
為方便起見,令ai+1=kn-1,i=1,2,…,n-1
(k1k2…kn-1)↑=(anan-1…a2)↑
ai:i的右邊比i小的數字的個數
在這樣的定義下,
有839647521←→(67342221)↑
(67342221)↑+1=(67342300)↑←→849617523
6×8+7)×7+3)×6+4)×5+2)×4+2)×3+2)×2+1 =279905
由(anan-1…a2)↑求p1p2…pn。
從大到小求出n,n-1,…,2,1的位置
_ ... _ n _ _ …_ (an個空格)
n的右邊有an個空格。
n-1的右邊有an-1個空格。
…………
2的右邊有a2個空格。
最後一個空格就是1的位置。 在遞增進位制數法中,中介數的最低位是逢2進1,進位頻繁,這是一個缺點。
把遞增進位制數翻轉,就得到遞減進位制數。 (anan-1…a2)↑→(a2a3…an-1an)↓
839647521→ (12224376)↓
(12224376)↓=1×3+2)×4+2)×5+2)×6+4)×7+3)×8+7)×9+6=340989
[注意]求下一個排列十分容易 遞減進位制數法的中介數進位不頻繁,求下一個排列在不進位的情況下很容易。
這就啟發我們,能不能設計一種演算法,下一個排列總是上一個排列某相鄰兩位對換得到的。
遞減進位制數字的換位是單向的,從右向左,而鄰位對換法的換位是雙向的。 這個演算法可描述如下:
對1—n-1的每一個偶排列,n從右到左插入n個空檔(包括兩端),生成1—n的n個排列。
對1—n-1的每一個奇排列,n從左到右插入n個空檔,生成1—n的n個排列。
對[2,n]的每個數字都是如此。
839647521
字典序法 遞增進位製法 遞減進位製法 鄰位對換法
下一個 839651247 849617523 893647521 836947521
中介數 72642321↑ 67342221↑ 12224376↓ 10121372↓
序 號 297191 279905 340989 203393

㈣ a43排列組合公式是什麼

從四個元素中選三個元素的排列數 為:A43=4×3×2=24。

從四個元素中選三個元素的組合數為 :C43=4×3×2/(3×2×1)=4。

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。

公式:全排列數f(n)=n!(定義0!=1)

以下介紹全排列演算法四種:

1、字典序法

2、遞增進位制數法

3、遞減進位制數法

4、鄰位對換法

用具體的例子來理解上面的定義:4種顏色按不同顏色,進行排列,有多少種排列方法,如果是6種顏色呢。從6種顏色中取出4種進行排列呢。

解:

A(4,4)=4x(4-1)x(4-2)x(4-3)x(4-4+1)=4x1x2x3x1=24。

A(6,6)=6x5x4x3x2x1=720。

A(6,4)=6!/(6-4)!=(6x5x4x3x2x1)/2=360。

㈤ 全排列遞歸演算法

希望我的答復可以幫助你加深理解:

第一,perm函數中的條件for(int i=k;i<=m;i++)應更正為 for(int i=k;i<m;i++)

第二,你可以在核心步驟的前後列印有關變數的值,分析查看每一步的具體執行情況,這是編程調試的重要能力,要加強。
第三,以下是我提供的附件程序及運行結果(以1,2,3這個數組的全排列),可輔助分析:

1. 程序源碼=================================================
#include <stdio.h>
#include <stdlib.h>
int N,P=0;

void swap(int a[],int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}

void perm(int a[],int k,int m,int pk,int pm)
{
int i;
/*k為中間變數,m初始化為參與排列元素的起始坐標和終止坐標
pk,pm分別表示參與排列元素的起始坐標和終止坐標,整個遞歸過程保持不變*/
if(k==m)
{
printf("----->perm %d :\n",P/N+1);/*列印提示*/
for(i=pk;i<pm;i++)
{
printf("%d ",a[i]);
P=P+1;
}
printf("\n\n");
}
else
{
for(i=k;i<m;i++)
{
printf("a %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("b %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
perm(a,k+1,m,pk,pm);
printf("c %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("d %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
}
}
}

int main()
{
/*調節以下N值及對應數組內容,可列印對應數組對應的全排列*/
N=3;
int t[]={1,2,3};
/*調節以上N值及對應數組內容,可列印對應數組對應的全排列*/

perm(t,0,N,0,N);
printf("----->Over!\n");/*列印提示*/
system("pause");
return 0;
}

2.列印結果 ============================================================

a 0,0,1,2,3
b 0,0,1,2,3
a 1,1,1,2,3
b 1,1,1,2,3
a 2,2,1,2,3
b 2,2,1,2,3
----->perm 1 :
1 2 3

c 2,2,1,2,3
d 2,2,1,2,3
c 1,1,1,2,3
d 1,1,1,2,3
a 2,1,1,2,3
b 2,1,1,3,2
a 2,2,1,3,2
b 2,2,1,3,2
----->perm 2 :
1 3 2

c 2,2,1,3,2
d 2,2,1,3,2
c 2,1,1,3,2
d 2,1,1,2,3
c 0,0,1,2,3
d 0,0,1,2,3
a 1,0,1,2,3
b 1,0,2,1,3
a 1,1,2,1,3
b 1,1,2,1,3
a 2,2,2,1,3
b 2,2,2,1,3
----->perm 3 :
2 1 3

c 2,2,2,1,3
d 2,2,2,1,3
c 1,1,2,1,3
d 1,1,2,1,3
a 2,1,2,1,3
b 2,1,2,3,1
a 2,2,2,3,1
b 2,2,2,3,1
----->perm 4 :
2 3 1

c 2,2,2,3,1
d 2,2,2,3,1
c 2,1,2,3,1
d 2,1,2,1,3
c 1,0,2,1,3
d 1,0,1,2,3
a 2,0,1,2,3
b 2,0,3,2,1
a 1,1,3,2,1
b 1,1,3,2,1
a 2,2,3,2,1
b 2,2,3,2,1
----->perm 5 :
3 2 1

c 2,2,3,2,1
d 2,2,3,2,1
c 1,1,3,2,1
d 1,1,3,2,1
a 2,1,3,2,1
b 2,1,3,1,2
a 2,2,3,1,2
b 2,2,3,1,2
----->perm 6 :
3 1 2

c 2,2,3,1,2
d 2,2,3,1,2
c 2,1,3,1,2
d 2,1,3,2,1
c 2,0,3,2,1
d 2,0,1,2,3
----->Over!
請按任意鍵繼續. . .

㈥ 全排列遞歸演算法P(m,n)

#include<stdio.h>
main()
{
int i,j,k,m;
for(i='A';i<='G';i++)
for(j='A';j<='G';j++)
for(k='A';k<='G';k++)
for(m='A';m<='G';m++)
printf("%c%c%c%c",i,j,k,m);
}

注意這里在輸出的時候沒有使用printf("%c%c%c%c\n",i,j,k,m)換行符,是因為輸出的數據太多,會顯示不下

㈦ VB全排列演算法。

新建一個工程,在窗體上新建一個text1,一個command1,把以下代碼復制到工程中運行試試

OptionExplicit

PrivateList()AsString

Publicindex&,tmp$

PrivateSubCommand1_Click()

ReDimList(Len(Trim(Form1.Text1.Text)))

Forindex=1ToLen(Trim(Form1.Text1.Text))

List(index)=Mid(Form1.Text1.Text,index,1)

Nextindex

PermList,1,Len(Trim(Form1.Text1.Text))

EndSub

PrivateSubForm_Load()

Form1.AutoRedraw=True

EndSub

PublicFunctionSwap(ByRefNum1AsString,ByRefNum2AsString)'交換兩個數

tmp=Num1

Num1=Num2

Num2=tmp

EndFunction

PublicFunctionPerm(ByRefListTar()AsString,ByValkAsLong,ByValmAsLong)'全排列函數

Dimi&

Ifk>mThen

Fori=1Tom

PrintListTar(i);

Nexti

Print

Else

Fori=kTom

SwapListTar(k),ListTar(i)

PermListTar,k+1,m

SwapListTar(k),ListTar(i)

Nexti

EndIf

EndFunction

運行效果

㈧ C++全排列怎麼弄

你的全排列演算法不成立,我給你一個全排列的例子,你看看吧.

#include<iostream>
#include<cstring>
usingnamespacestd;
staticintcount=0;
voidSwap(char*a,char*b)
{
chartmp=*a;
*a=*b;
*b=tmp;
}
voidAllRange(char*pszStr,intk,intm)
{
if(k==m)
{
count++;
cout<<pszStr<<endl;
}
else
{
for(inti=k;i<=m;i++)
{
Swap(pszStr+i,pszStr+k);
AllRange(pszStr,k+1,m);
Swap(pszStr+i,pszStr+k);
}
}
}
intmain()
{
intn;
cin>>n;
char*szTextStr;
sprintf(szTextStr,"%d",n);
cout<<szTextStr<<"的全排列如下:"<<endl;
AllRange(szTextStr,0,strlen(szTextStr)-1);
cout<<"共"<<count<<"個"<<endl;
return0;
}

㈨ 全排列計算公式是什麼

全排列公式:全排列數f(n)=n!(定義0!=1)。

全排列是從從N個元素中取出M個元素,並按照一定的規則將取出元素排序,我們稱之為從N個元素中取M個元素的一個排列,當M=N時,即從N個元素中取出N個元素的排列。

以最常見的全排列為例,用 S(A)表示集合 A 的元素個數。用 1、2、3、 4、5、6、7、8、9 組成數字不重復的九位數。

則每一個九位數都是集合 A 的一個元素,集合 A 中共有 9個元素,即 S(A)=9。如果集合 A 可以分為若干個不相交的子集,則 A 的元素等於各子集元素之和。

鄰位對換法

遞減進位制數法的中介數進位不頻繁,求下一個排列在不進位的情況下很容易。

這就啟發我們,能不能設計一種演算法,下一個排列總是上一個排列某相鄰兩位對換得到的。

遞減進位制數字的換位是單向的,從右向左,而鄰位對換法的換位是雙向的。 這個演算法可描述如下:

對1—n-1的每一個偶排列,n從右到左插入n個空檔(包括兩端),生成1—n的n個排列。

對1—n-1的每一個奇排列,n從左到右插入n個空檔,生成1—n的n個排列。

對[2,n]的每個數字都是如此。

㈩ 求遍歷全排列的演算法

全排列的生成演算法就是對於給定的字元集,用有效的方法將所有可能的全排列無重復無遺漏地枚舉出來。

常見的有四種全排列演算法:
(A)字典序法
(B)遞增進位制數法
(C)遞減進位制數法
(D)鄰位對換法

這里著重介紹字典序法

對給定的字元集中的字元規定了一個先後關系,在此基礎上規定兩個全排列的先後是從左到右逐個比較對應的字元的先後。

[例]字元集{1,2,3},較小的數字較先,這樣按字典序生成的全排列是:123,132,213,231,312,321。

[注意] 一個全排列可看做一個字元串,字元串可有前綴、後綴。

1)生成給定全排列的下一個排列 所謂一個的下一個就是這一個與下一個之間沒有其他的。這就要求這一個與下一個有盡可能長的共同前綴,也即變化限制在盡可能短的後綴上。

[例]839647521是1--9的排列。1—9的排列最前面的是123456789,最後面的是987654321,從右向左掃描若都是增的,就到了987654321,也就沒有下一個了。否則找出第一次出現下降的位置。

熱點內容
python實用代碼 發布:2025-05-13 22:19:41 瀏覽:842
dede資料庫的配置文件 發布:2025-05-13 22:19:08 瀏覽:966
給字元加密 發布:2025-05-13 22:12:32 瀏覽:972
資料庫系統實現答案 發布:2025-05-13 22:11:57 瀏覽:140
哪個軟體可以共存安卓 發布:2025-05-13 22:10:15 瀏覽:552
上傳宦妃天下野泉肉肉 發布:2025-05-13 22:10:10 瀏覽:408
洗眼睛解壓 發布:2025-05-13 21:58:28 瀏覽:272
c存儲指針 發布:2025-05-13 21:49:04 瀏覽:921
結繩編程軟體 發布:2025-05-13 21:49:03 瀏覽:850
解壓體育館 發布:2025-05-13 21:27:48 瀏覽:263