Title 順列の生成法 Author(s) 山崎, 秀記 Citation 情報 - HERMES-IR

Title
Author(s)
Citation
Issue Date
Type
順列の生成法
山崎, 秀記
情報処理, 24(4): 378-381
1983-04-15
Journal Article
Text Version publisher
URL
http://hdl.handle.net/10086/16410
Right
Hitotsubashi University Repository
Vol
.24 No.4
情
報
処
A
理
7.順 列 の 生 成 法T
山
崎
秀
記IT
本稿では
1. ま えn個の要素からなる
か き
生成す る手続 きを紹介する. こ順列すべてを効率 よ く
B
Z
)
1
ようで,1
れ 自身興味ある問題の
81
2句 こはすでに,すべて
序で生成する手続 きが発表 されて の順列を辞書式J
r
B
のが単純で,解 くことはそ う易
P
T
.1
9
8
3
圭
にしらみつぶしの探査を
図2
例えば 3次の魔法陣 (
避
けるのにも役立つ.
例,図
1
)
いる1
)
. 問題そのも
き, 1か ら 9までの数か らなる順列をすべて求め.
ると
;
味を引いたのだろう.またその しくないので先人の興
の良
PI
P2
-P9をす
るかどうか調べる, としよう.,図2が 魔法陣にな
べて生成 し,それぞれについて
意味でプログラミング
さて実際の場面であらゆる場
い練習問題でもある.
(
順列を 9桁の数 とみて小 さい この とき,辞書式塀序
べてみたいときに, n次の順列合をしらみつぶしに調
法をとれば, 順列の生成が大幅
順で順 列 を生成する方
きが ほし くなることがある.しをすべて生成す る手続
に省略で きる.まS,
123456789 というJ
r
A列か ら調べる
えば,それは nが大 きいときはさ
かし結論を言 って しま
n. n次
けた方がよい
の順列は全部で n!個あ り,どう工夫しても
省略で きる. つまりこの問題につい
t
.個の順列の生成が
8
0
0
36
2万 8
あらゆる順序で入れ換わった後
9
1万 6
1
2!
- 4 39
8
0
0
うな順列生成法が
1
引-6
2億 79
0
0万 1
6
0
0
その a営業所, B本社 とその も営てみよう.A本社と
2 くらい べての順列が生成で き
るのはたかだか n-1
社の 6カ所を今 日中に廻 りたい 業所,他 こC社,D
際の応用問題では,J
I
A列生成にまで である. しかも実
ずその本社に寄るとして 最 も .営業所へ着 く前に必
された順列の処理にかか る手間かか る手間より,生成
る. この場合,Aと a,Bとも
速 く訪 れ る順序を求め
のが普通であ る.だ とすればどの生成方法を用いる
の方がはるかに大 きい
順序になっていない順列は調べの相対的順序が,この
って この問題に適 しているJ
J
j
g列 る必要がない.したが
か
て 1
生成法は,各
,
2
,-,
iの相 対 的 位 置が不変のまま
, iについ
き,すべての順列をいかに効率 みつぶしに調べたいと
があらゆる位置に現れ,その後
問題に精力をそそぐよりも, どよ く生成す るかという
わ る, と
を生成しな くてもすむか, しらうした らすべての順列
避けるか,に精力を
ては PL
'
1
-PAが
初めて Plが換わるよ
こんどは次のような問題を考え
適 しているといえる.
上の表か らわかるように,す
億2
7
0
2万 0
8
0
0
は余
結局,ある問題についてしら
り差がない.
:
3
わけだが,12
ら P9をどう入れ替えても魔法 6
≠1
5なので P4か
って,J
r
R列 123987654まで陣にならない.したが
6
!の手
間がかか
1
0!
る.
1
1!
-
・
・
・となる順列は Pl
+P2
+P3
-
i
+1
,-I
,
7
2
で初めて iの位置が変
最 も速い順列生成の方法
いった手続 きである.
とい
みつぶしの探査をどう
要ではないにしても,いろいろなJ
うのは実用上さして重
それでも,どうして
そそぐべ
もすべて
きであ'
8一
ることは意味があるし,それ 白
があるときは本稿が参考になるの順列を生成する必要
r
R列生成の手法を知
る.本稿では 2章で順列中の 2身興味を引 く問題であ
次と新しい順列を生成 してい く方
要素の交換によって次
だろう
.またそれ以上
IAl
g
o
r
i
t
hmsf
orGe
ne
r
at
i
ngPe
r
mut
a
t
i
o
nsby
Hl
SAKI(
Tokyol
ns
t
l
t
ut
eOfTe
c
hnol
o
gyDe
pa
r
t
m
d
e
e
n
k
t
iYAMAI
ma
t
i
o
n
ofl
nf
o
r
・
‡
ニ
ー
:
-
生
法を, 3章では巡回
置換による方法を, 4章では辞書式順序の順成
†I東京工業大学理学部情報科学科
Sc
i
e
n
c
e
)
.
3
7
8
γol
.24 No.4
3
7
9
順列の生成法
ここで以下の章の記述を簡単にするためにいくつか
を書けるが, ここでは他の手続 きとの比較上,再帰呼
F
B列は大 きさ nの配列 Pで
の記法を定めよう.n次のJ
i
]で P[
i
]と
び 出 しを用 い な いで書 く. 配列 C[
表わす.要素は 1か ら nまで とし最初は常に P[1]-
P[1‥i
-1] のどれかとの交換の回数 (
正しくは 回数
1
,
-,P[n]-n である. (
要素が 1か らnまでの数で
i
]<iなる最小の i(
≧2)を見つ け
+1
)を表わす.cl
あるという仮定は手続 きT4以外では本質的でない.
)
て,P[
i
]での交換を行い,このとき C[
1"i-1] をそ
配列 P の一部を参照したい こ とが よ くあ る.そこ
れぞれ 1に置 き直せば目的の手続 きがえられ る.
],-・
,P[j](
1≦i
<j≦n)を P[
i.
.
j]で表わ
で P[i
pr
oc
e
dur
eTl;
す.したが って P[1‥n] は配列 P 全体を表わす.
2章では P[i
] と Pl
j]の交換が基本操作となる.
これを P[
i
-j] と書 く. 例えば P[1.
.
5]-43125
pr
OC
e
S
S;
f
ori
:
-2 t
on docl
i
]=
=lod・
,i:
-2;
r
e
pe
ati
fcl
i
]<i
に対し,P[
2←4] を実行した結果は P[1.
.
5]-421
一●
35である.巡回置換は P[i‥j]で表 わ す. これは
t
he
n P[
i
-i
nde
x];pr
oc
e
s
s;
P[
i
]に P[
i
+1] を,P[
i
+1]に P[
i
+2]を,-
e
l
s
ec[i
]・
-1;i
:
-i
+1f
i
P[
j-1
] に P[j]を,そして,P[j]には P[
i
]を
代入することを意味す る.例えば, P[1.
.
5]-43125
◆
・
-に P[
2‥4]を実行した結果は P[1.
.
5]-41235で
●
一ある,P[i‥j]を逆順に並べかえ る操作は P[
i.
.
j]
:
+∴
し
で表わす.P[1.
.
5]-43125のとき P[
2‥5]を実行
,
すると,P[1‥5]-45213 となる.
以下の章で与える手続 きでは,順 列 生成 手 続 きを
"
主プログラム"と考えて, 順 列 を生成するたびにそ
cl
i
]=
-cl
i
]+1;i
:
-2
unt
i
li
>N.
さて P[
i
]の C[
i
] 回目の交換の相手の指標 i
nde
x
を求める問題が残 っている.表として覚えてお くこと
もで きるが,We
l
lのアル ゴリズム8
)では
i
nde
x・
-i
f(
iは偶数)t
he
n i-C[
i
]e
l
s
eill
,
He
a
pのアルゴリズム2)では
i
nde
x:
-i
f(
iは偶数)t
he
n cli
]e
l
f
l
e1
,
である.He
a
pのアルゴリズムの計 算 例 を示 そ う.
の順列を処理する手続 き pr
oc
e
s
sを 呼 ぶ よ うにして
(
n-4)1
23
4
.21
3
4
,畠i
24
,1
3
24
,畠51
4
,3
21
4
,4
21
3
,
ある.
24
1
3
,1
4
2
3
,41
2
3
,21
4
3
,1
24
3
,1
34
2
,31
4
2
,41
3
2
,
なお, この解説は Se
dge
wi
c
k6
)を主 に参考にして
1
4
3
2,34
1
2
,4
31
2,4
3
21
.34
21
,24
31
,4
2
31
,3
24
1
,
書いた. これは順列生成の秀れた概説であ り,詳しい
23
4
1
.(
・
印は次の順列を生成す るための交換の場所を
参考文献がついている. より詳しく知 りたい読者は,
表わす.
)
、
これを手掛 りにすることをお勧めす る.
-1
]の順列をすべ
これ らの手続 きの特徴は,P[1‥i
て生成してか らは じめて P[
i
]を動かす こ とである.
2.交換 に よ る方 法
ある順列か ら新しい順列をえる手近な方法は, 順列
の2個の要素を交換することだろう. この童では交換
2
.
2 繰 り返 し的方法
1
,・
・
・
,n-1 の各J
r
B列に対して, その要素の問 (
両端
を含めて nカ所ある)に nを順に入れてい くと 1
,-,
によって, n次の順列すべてを次刺 こ生成す る手続 き
n の順列がすべてえ られる.この考 え方 に従 って,
嫁紹介す る.
ot
t
e
r
7) は独立に 1
9
6
2年に,隣接要
Johns
on3) と Tr
2
.
1 再帰的方法
-1 回で n次のJ
r
B列をすべて生成す る手
素の交換 n!
P[
1‥n] の 順 列 を す べ て 生 成 す るに は, まず
続 きを示 した.
P[
1‥n-1
]の順列をすべ て 生 成 し,次に P[
n] と
i
]で 要 素 iが 何 回 動いたかを覚えておけ
配列 cl
P[
1‥n-1
]のどれかひとつ とを交換 し, 再び P[
1.
.
]<iなる最大の iが次に移動す る要素である.
ば,cli
n-1
]のすべての)
J
R列を生成す る, ということを くり
したがって手続 きの枠組みは次のようになる.
返せばよい.P[n] に 1
,・
-,nがすべて 1度ずつ現れ
pr
OCeS
S;
るようにすれば,p[
1‥n] のすべての 順 列 を生成で
f
o
ri
=
-2 t
o n docl
i
]=lod;i
:
-n
せる.具体的に,P[n] をどれ と交換すればよいか と
r
e
pe
ati
fcli
]<i
いう問題はさておいて (
後で見 るよ うに何通 りも解が
ある)
, この考えに沿 った手 続 きを書いてみよう.考
え方が再帰的なので,再帰呼び出しを用いても手続 き
t
he
m P[
i
nde
x←i
nde
x+1
];pr
oc
e
s
s;
cl
i
]:
-cl
i
]+1;i
・
-n;
e
l
s
ec[
i
]L
-1;i
ユ
ニi
-1f
i
3
8
0
情
報
処
Apr
.1
9
8
3
理
t
L
nt
i
li
<2.
二
+
P
[
1
‥i
]を用いる.巡 l
司置 換 を用いる方法にも再帰
ここで要素 iは P[
i
nde
x]か P[
i
nde
x+1
] に入
的方法と繰 り返し的方法 とがあるが ここでは繰 り返し
っている.i
nde
xの求め方を調べるために,どんな列
的方法を述べよう.
を生成したいのか眺めてみよう.
pr
oc
e
dur
eT3;
1
2
34
,1
24
3
,1
毎
41
23 (
4が左へ)
41
3
2,1
4
3
2
,1
34
2,1
3
2
4
,
(
次に 3が 1つ左へ動 き, 4は今度は右へ移動す る)
pr
OC
e
S
S;
f
ori
=
-2t
ondocl
i
]
:
-1od;i
:
-n;
+i
.
i
];
r
e
pe
atPl1.
31
24
,31
4
2,3
4
1
2,4
31
2
i
fc
l
i
]<i
,
2
,
3の中では左端に来たので, 2が左へ.
)
(
3も 1
4
3
21
,34
21
,3
24
1
,3
21
4
t
he
nc
[
i
];
-C[
i
]+1;
i
=
-n;pr
oc
e
s
s
e
l
s
ec
[
i
]
:
-1;i
:
-z
L 1f
i
unt
i
lZ
<2
(
3が今度は右へ)
231
4
,23
4
1
.24
31
,4
23
1
2章の手続 きとは異な り,巡回置換を施す位置を求
4
21
3
,24
1
3
,21
4
3
,21
3
4
(
4
,
3
,
2すべて端に来ている. 1を 動 か す番になった
ので終 り.
)
隣接要素の交換だけですますために,各要素が左へ
める手間は要 らない.しかし巡回置換 自身の手間がか
●
-かることと (
P[
1.
i
]は iに比例す る手間がかかる)
,
⊂
=
:
≡
P[
1.
.
i
]を (
i
-1
)回施したあと, もう一度 P[
1‥i
]
論理型の配列 d[
i
]で,左なら真,右なら偽,と覚え
を施 して順列を元の状態 に戻 して い る (
手続 き中の
◆
-・
P.
[
1
-i]の位置に注意) ことか ら, このアル ゴリズム
は決して効率のよいものではない.にもかかわ らずこ
[
i
]回目の移動 (
交
てお く. さて問題は, 要素 iは C
こで紹介した理 由は次のような単純な手続 きがえられ
換)の ときどの位置にいるか,である. 1から iまで
るか らである.
動いた り右へ動いた りすることに注意しよう. これを
の中では,左へ動 いて いるときは i
+1-cl
i
]番 目に
l
i
]番目に居 る.全体
いて,右へ動いているときは c
の中では,i
+1か らnまでの中でその とき左 端 に来
こ
=配列 c
l
7
]の役 目は,P[
1‥i
]を何回行 ったかを覚え
■
-てお くことである.P[
1‥i
]を実行するのは c
l
i
]<i
し,次の手続 きがえられ る.
なる最大の数のときである. このときまでに手続 きは
=
:
P[
1.
.
n] を n回実行 して P[
n]-n,P[
1,
.
n-1
]を
=
=n-1
]-n-1
,
・
・
・
,
P[
1日i
+1
]を
n-1回実行 して P[
pr
oc
e
dur
eT2;(
J
ohns
on3
)Tr
ot
t
e
r
7)
)
i
+1回実行して, P[
i
+]
.
]-i
+1
, である. しか し
ている要素 (
即ち d[
j]が真から偽に変 った j)の数
だけ右へず らさなければならない. このずれを∬で現
pr
OC
e
S
S;
f
o
ri
:
-2t
ondoc
l
i
]
:
-1;dl
z
L
]
:
-t
r
ueod;i
:
-n;
i
]<i
re
pe
ati
fcl
t
l
l
e
r
Li
fdl
i
]t
he
ni
nde
x:
-i
-C[
i
]+X
e
l
s
ei
nde
x・
-C
[
i
]+E丘;
P[
i
nde
x-i
nde
x+]
];pr
o
c
e
s
s;
C[
i
]
・
-C
[
i
]+1;i
=
-n;a:
-0
e
l
s
ei
fd[
i
]t
he
na:
=x+1f
i;
dl
i
]
・
=notdl
i
];
cl
i
]
・
-1;i
・
-i
-1f
i
unt
i
li
<2
.
この方法の特徴は, 1から i
-1 までの相対的順序
が不変のまま,iか ら n までがあらゆる位 置 を動 く
ことである.
3.巡 回置換 によ る方 法
1日i
] の巡回置換
この章では基 本 演算 として P[
こ
=
P[
1‥i
]はまだ i回実行されていないので P[
i
]<iで
ある. 即ちこの手続 きは P[
i
]<iなる最大の iに対
■
・
して P[
1.
.
i
]を実行す る.配列 C
[
i
]は必要ない.
proc
e
dur
eT4;(
La
ngdon4))
pr
OC
e
S
S;
l
;
=n;
こ
=
];
r
e
pe
atPllHi
i
fPl
1.
.
i
]<it
he
ni
:
=n;pr
oc
e
s
s
e
l
B
ei
;
=i
-1f
i
unt
i
li
<2.
この手続 きは見かけ上最 も単純なものだろう.
4
.辞書 式順 序 の生成
この章ではすべての順列を辞書式順序で生成する手
続 きを示す.再 帰 的 に考えてみよう.P[
1‥n]のす
べてのJ
J
R列を辞書式順序で生成するには,まず P[
2‥
r
R序で生成す る. その結果 P[
2‥n]は
n]を辞書式J
γo
l
.2
4 No.4
3
81
順列の生成法
大きい方か ら逆に並んでいるか ら,P[
1
]と Pl
n]を
pr
oc
e
dur
eT6;
交換し,P[
2.
.
n] を逆に並べかえる.再び P[
2.
.
n]
J:
-nll;
の順列全部を辞書式 順 序で 生 成 す ると こん ど は,
whi
l
ej<lorPlj]>Plj+1]do j:
=j-1o
d;
P【
1
]-2,Pln-1
]-3,Pln]-1となるか ら P[
1
]と
i
fj>lt
he
r
L
P[
n-1
]を交換し Pl
2.
.
n] を逆 に並べかえる. こ
k:
-n;
1
]に 1
,
2,-,n が この 順で現れ,
うしていけば P[
whi
l
eP[j]>P[k]dokま
-k-1od;
:
≡ ==
P[j-k];P[j+1‥n]
Pl
1‥n]の順 列 を辞書式J
I
B序ですべて生成で きる.
基本方針はこれでよいのだが,次の手続 きでは,配列
丘
の添字の計算と簡単にす るために,順列を配列 P[
1.
.
この手続 きを最初か ら順列全体が逆順になるまで繰
n
]ではなく,P[1‥n]-Q[n‥1
]なる配列 Q[1‥n]
り返せばすべての順列が生成で きる.それが Fi
s
c
he
r
・
を用いて表わす.
Kr
a
us
e
l
)の方法である.
p
r
o
c
e
dur
eT5;(
Or
d・
Smi
t
h5)
)
p
r
O
C
e
S
S;
:
-2t
o n_
doc[
i
]
=
-1od;i
=
-2
f
o
ri
r
e
pe
ati
f cli
]<i
一・
・
・
・
・
一
一
一
一
一
一
◆
t
l
l
e
n Q[
i
‥cl
i
]
];Ql1.
.
i
-1
];
pr
OC
e
S
S;
cl
i
]・
-cl
i
]+1;i
:
-2
e
l
s
ec[i
]・
-1;i
l
-i
+1f
i
unt
i
li
>n.
Q[
n.
.
1
]-(
1
,
2,・
・
・
,n)で始めれば, Q[
n-1
]に1
,
2
,
-,
nのすべてのJ
l
R列が辞書式J
)
R序で現れ る.もし
もとの配列 P[
1.
.
n]で計算したければ,
Q[
i
-C[
i
]] を P[
n+11'
←n+1-cl
i
]] に,
- - 一
・
.
・
.
・
.
・
→
P[
n+2-2
'
‥n] に,
十
・
・
.
・
.
-◆
Q[
1.
.
i
-1
]を
置きかえればよい.
配列 P[1.
.
n] に戻って議論を進めよう.上の手続
n+1-i
-n+1-cl
i
]
]が行われ るときの
きで命令 P[
(
n+1-i
) の 値 は, Pl
j]<P[j+1
]>P[j+2]>・
・
・
,P
[j]の 交 換の相手
P
[j] の次に小 さい要素である・
>p[
n] なる j の値に等し く
は Plj‥n] 中の
このことか らある順列 Pl1.
.
n] が与えられた とき,
それを辞書式順序で次に くる順列に変換す るには次の
ようにすればよいことがわか る.
参 考 文 献
1
)Fi
s
c
he
r
,L L and Kr
a
us
e
,K.
C∴ Le
hr
buc
h
de
rCombi
na
t
i
ons
l
ehr
eund de
r Ar
i
t
hme
t
i
k,
Dr
e
s
d;
n(
1
8
1
2
)
.
R・
:Pe
r
mut
a
t
i
onsby i
nt
e
r
c
ha
nge
s
,
2)He
a
p,B・
Co
mput
,J
.
,Vol
・1
8,No.1
,pp.29
3
1
29
4(
1
9
6
3
)
.
3
)J
ol
ms
on,S.
M.:Ge
ne
r
a
t
i
on ofPe
r
mut
a
t
i
ons
byadj
a
c
e
ntt
r
a
ns
pos
i
t
i
on,Ma
t
h.Co
mput
.
,Vo
l
.
1
7
,pp.28
2
28
5(
1
9
6
3
)
.
4)Lo
ngdon,G・
G・
,J
r
・:Ana
l
gor
i
t
hm f
orge
ne
r
a
t
i
ng pe
r
mut
a
t
i
ons
,Comm.ACM,Vol
.1
0
,
No.5
,pp.29
8
2
9
9(
1
9
6
7
)
.
5
)Or
d・
Smi
t
h,良.
∫
.:Ge
ne
r
at
i
onofPe
r
mut
a
t
i
ons
i
nLe
xi
c
o
gr
a
phi
cOr
de
r
,Co
mm.ACM,Vol
.ll
,
No.2,p.1
1
7(
1
9
6
8
)
.
6)Se
d
ge
ic
w
k, A.
: Per
mut
a
t
i
o
n Ge
ne
r
a
t
i
on
Me
t
hods
,Co
mput
・Sur
v" Vo1
.9
,No,2,pp.
1
3
7
-1
5
5(
1
9
7
7
)
.
有浮 誠訳 :順列生成の手法,bi
t
,Vo
l
.1
0
,No.
6
,pp,6
9
9
7(
1
9
7
8)
.
7)Tr
ot
t
e
r
,H.
F.:Pe
r
m,Co
mm.ACM,Vo
l
.5,
No.8,pp.4
3
4
4
3
5(
1
9
6
2)
.
8
)We
l
l
s
,M.
B∴ Ge
ne
r
a
t
i
onsofPe
r
mut
a
t
i
onsby
t
r
a
ns
pos
i
t
i
on,Ma
t
h.Co
mput
"Vol
.1
5
,pp.1
9
2
1
9
5(
1
9
6
1
)
.
(
昭和 5
7年 1
2月 1 日受付)