10/08/21 19:32:14
なお部分一致している局面集合の検索ならRDBだけですみやかに実現できる。
将棋の局面は81マス+持駒の数(8種類分x2)で特定できるから、
盤の表現に81列、持駒の表現に16列、対局情報レコードへの参照に1列程度、という100列程度のレコードのテーブルを作ればいい
(Microsoft SQL Serverのようにレコードサイズに制限があり、それに収まらない場合はテーブル分割などの工夫が要るが)
たとえば、2010年に指された5五が金将である局面を全てリストアップするには、(year列、"対局ID"列とかを設けるとして)
SEELCT * FROM (局面table) JOIN (対局table) ON (対局table).ID = (局面table)."対局ID"
WHERE (対局table).year = 2010 AND (局面table)."5五" = 5
とかやると良い(金将のコードを5、局面テーブルに"5五"という列があり、コードが格納されているとして)
さてこれはRDBの理屈に即した演算で済むから良いのだが、問題は1つの対局内の局面を時系列順に全て得たい、というときだ
ぶっちゃけ、RDBのレコードでリンクリストを実現してリスト構造(や木構造)を作ってやっても、
それをたどるのにn回SELECTを発行する羽目になって効率が悪い
だったら、リンクリストなどやめて1回のSELECTで局面をまとめて取得→オンメモリで並べ替える(ただし、あらかじめindex列を設けておく)
というのが多分正解
structで一生懸命説明している人はここらの話(レコードのオブジェクトへのマッピングをどうするのが良いか)について説明していないし、
多分ポイントを把握もしていない