99.07.13 deepgreen 更新履歴 99.07.13 恐れ入りますが、固定ピッチのフォントで表示してください。 記述ミスを訂正(Bitmap形式からNodeMatrix形式への変換) 記述ミスを訂正(NodeMatrix形式からBitmap形式への変換) アルカンの構造異性体の数をパズル的に(シラミツブシに)解く方法です。 □ 解法の概要 大きさN(炭素数がNという意味)のアルカンの構造異性体が既知として、(N+1)の 大きさのアルカンの構造異性体を求めるという方法です。 +−−−−−+ +−−−−−+ |アルカンの| +−−−−−−−−−+ |アルカンの| |構造異性体| |・(N+1)を生成| |構造異性体| |のBitmap |−−> |・ 標準形式に変換 |−−> |のBitmap | |(N) | |・ 重複検査 | |(N+1)| | | +−−−−−−−−−+ | | +−−−−−+ +−−−−−+ □ アルカン構造体の表現法 [例題パターン] C3 | C1−C2−C4−C7 | C5 | C6 (その1)NodeMatrix形式 炭素(ここではNodeと呼ぶ)に番号をつけ、各Node間の接続状態を2次元配列 Node[][]で以下のように表現する。 i番目のNodeには、 Node[i][0] :Node(i)に接続しているNodeの数(1〜4) Node[i][j] :Node(i)に接続している他Nodeの番号 jは、1− Node[i][0]まで (例)例題パターンのNodeMatrix表現 [0][1][2][3][4] Node[1] 1 2 [2] 3 1 3 4 [3] 1 2 [4] 3 2 5 7 [5] 2 4 6 [6] 1 5 [7] 1 4 この表現法は、取り扱いは易しいが、必要とするスペースが大きいので大量のパタ ーンを格納するには向きません。 (その2)Bitmap形式 各Nodeの接続数が1〜4であることに着目し、接続数の列として表現する。 この方法は、2ビット*Nで1つのパターンを表現できます。 接続数 ビットパターン 1 00 2 01 3 10 4 11 表記法 L,D,U,Rが既にビットパターンに変換済とすると、全体のBitmap表現 を以下のようにします。 U | L−C−R ===> L (Cの接続数) D U R | D (例) (1) C−C−C−C ==> 00010100 (2) C−C−C−C ==> 000110010000 | C | C どこを始点にとるかによって表現は変わりますので、例題パターンのいくつかの表現 を以下に示します。 (3) C1を始点とした場合 00100010010000 (4) C6を始点とした場合(その1) 00011010000000 (5) C6を始点とした場合(その2) 00011000100000 いくつかの表現パターンのうち、Bitmapが最小となるパターンを標準形と定義する。 こうする事で1つの構造体に1つのパターンを対応させることができます。 この表現法の長所は、コンパクト性と標準形の判断基準の容易性にあります。反面、 取り扱いは難しくなっています。たとえば、(3)の表現から(5)の標準形に変換する のはちょっと面倒です。 □ Bitmap形式からNodeMatrix形式への変換 (1) ビットパターンを2ビットずつ区切って順番にNode番号とする (2) pre,curの2つのポインタを使ってNodeのリンクをはる ・preはリンク元のNodeを指すようにする ・curの指すビットパターンが01のときは、preとのリンクをはるだけ ・curの指すビットパターンが10,11のときは、preとのリンクをはるとともに curの位置をスタックする (11のときは2度スタックする) ・curの指すビットパターンが00のときは、preとのリンクをはり、スタックから preをリストアする 00011010000000 わかりやすく書くと −−−−−−−−−− 000110(100000)00 | | | | | p q a b c p q a b c bはq(cはp)とのリンクをはらなければならない。そのために、qの時点でcurの 位置をスタックしておき、aのところでスタックからpreにリストアする □ NodeMatrix形式からBitmapt形式への変換 c | a−X−b | d (1) 指定された始点から Node[][0] >= 2 となる NodeXをサーチし、aの部分のBitmapを作成する (2) 再帰呼び出しを使って、b,c,dのBitmapを作成する (3) aを先頭とする最小のBitmapを作成する 例えば、c<b<dの場合は、 a 11 c b d となる □ 全体のアルゴルズム (1) Bitmap形式からNodeMatrix形式に変換する。 (2) NodeMarix上で大きさ(N+1)に拡張する。 (3) NodeMatrixのterminal(Node[i][0]=1のもの)を捜す。 (4) 上記のterminalを始点として、NodeMatrix形式をBitmap形式に変換する (5) (3),(4)をすべてのterminalについて実施し、最小のBitmap形式(標準形)を得る。 (6) (5)で得られた標準形が既にresult[]に登録されているかどうかを調べる。 未登録の場合は、登録する。 (7)(2)-(6)をすべてのNodeについて実施する。