Evolton

九州大学 2000年度 前期日程 第2次学力試験 場合の数・整数理系数学 第4問(b)

1からnまでの数でm個からなる重複しない数の順列を作り出す算法として,下記のものを考えた.
ただし,Sは順列を表し,算法の開始の時は数を含まない(Sは空であるという)とする.
算法の終了時には結果として順列を得るものとする.

算法[以下(a),(b),(c),の順に行う]

(a) Sを空とし,j=nm+1とする.

(b) 1からjまでの数からデタラメに数tを選ぶ.

(c) tが順列Sに入っているならば,tの直後にjを入れ,そうでないならば,tSの先頭に入れる.

(d) jを1増やす.

(e) jnならば,(b)へもどる.j>nならば,終了する.

(1) n=10m=6の場合で(b)において選ばれた数tは順に4,3,6,3,2,5であった.
その結果として得られる順列Sはどのような順列か.

(2) n=10m=6の場合で結果として得られた順列Sが827593であった.
(b)で選ばれた数tの列は何であったか.

(3) 算法の結果として得られた順列Sから(b)において選ばれた数の列を復元する算法を記述せよ.

難易度5/ 10計算量4/ 10目安15

場合の数整数 帰納的定義の利用、逆算、計算整理

方針

算法をそのまま追う問題である。(1)では j=nm+1 から n まで、選ばれた t が現在の順列に含まれるかを毎回判定して挿入位置を決める。(2)では逆向きに、最大の j から順に取り除く。j が順列中にあればその直前の数が選ばれた tj がなければ先頭に入った数そのものが t である。一般の復元算法もこの逆操作を記述すればよい。

解答

(1) n=10m=6 なので、最初は j=nm+1=5 である。選ばれた t は順に 4,3,6,3,2,5 である。

順に操作する。はじめ S は空である。 j=5t=4 のとき、4は S に入っていないので4を先頭に入れる。 S=4 j=6t=3 のとき、3は入っていないので S=34 である。j=7t=6 のとき、6は入っていないので S=634 である。j=8t=3 のとき、3は S に入っているので、3の直後に8を入れて S=6384 となる。j=9t=2 のとき、2は入っていないので S=26384 である。最後に j=10t=5 のとき、5は入っていないので S=526384 となる。したがって得られる順列は 526384 である。

(2)
逆向きに考える。結果が S=827593 である。最後に処理された j は10であるが、10は S に含まれていない。したがって最後の操作では、選ばれた t が先頭に入れられて消えた形であり、最後の t は先頭の8である。8を取り除いて S=27593 となる。

次に j=9 を戻す。9は順列中にあり、その直前は5である。よってこの段階の t は5であり、9を取り除いて S=2753 となる。次に j=8 は含まれていないので、先頭の2がその段階の t であり、2を取り除いて S=753 となる。次に j=7 は含まれているが、先頭にあるので、7は「t の直後に入った」のではなく、t=7 自身が先頭に入った場合である。したがってこの段階の t は7であり、7を取り除く。 S=53 次に j=6 は含まれていないので、先頭の5が t であり、5を取り除く。 S=3 最後に j=5 は含まれていないので、先頭の3が t である。

以上は後ろから復元した値なので、元の順に並べると 3,5,7,2,5,8 である。

(3)
結果として得られた順列を S とする。復元は次の手順で行えばよい。 j=n,n1,,nm+1 の順に処理する。各段階で、もし j が現在の S の中にあり、しかも直前に数があるなら、その直前の数をその段階の t として記録し、jS から取り除く。もし jS に含まれない、または j が先頭にあるなら、現在の S の先頭の数をその段階の t として記録し、その先頭の数を S から取り除く。

この操作で得られる t の列は後ろからの列なので、最後に逆順に並べれば、(b)で選ばれた数の列が復元される。

別解

解法2(挿入履歴を逆向きにたどる表)

方針

各挿入を「新しい j の親を t として記録する操作」と見る。
逆向きには最大の j から削除すれば、その直前の数、または先頭の数が
一意に元の t を与える。

解答

(1)
各段階の順列を表にするとjtS5446334766348363849226384105526384となる。従って S=526384 である。

(2)
最終順列から j=10,9,,5 の順に逆操作する。j復元した t削除後の S1082759395275382753775365353逆順に読んで、選ばれた列は3, 5, 7, 2, 5, 8である。

(3)
j=n,n1,,nm+1 と下げる。現在の Sj が先頭以外に
あれば、その直前の数を tj として記録し j を削除する。
j がない、または先頭にあるなら、先頭の数を tj として記録し、
その先頭を削除する。最後にtnm+1,tnm+2,,tnの順へ並べ直せばよい。各逆操作は前向き操作のちょうど逆なので、
復元列は一意である。

総評

難度は10段階中5、計算量は10段階中4。目安は15分。順方向の操作は単純だが、t がすでに順列にある場合だけ「j を直後に挿入する」点を丁寧に追う必要がある。逆操作では、大きい j から戻すのが自然である。j が先頭にある場合は「直前の数」がないので、j 自身が先頭に入った場合として処理する。この例外を明記できるかどうかが復元算法の完成度を左右する。

冊子PDFで見る九大の場合の数の問題で問題集を作る

出典: 九州大学 2000年度 前期 文系 第4問(b)。問題文はHTML表示のために再入力・数式組版しています。