Mercurial > hg > Papers > 2022 > soto-sigos
view Paper/tex/rbt_imple.tex @ 5:6c0b1fcbac2d
FIX SIGの論文ルールに基づいて修正
author | soto <soto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 05 May 2022 17:38:06 +0900 |
parents | 14a0e409d574 |
children | 9ec2d2ac1309 |
line wrap: on
line source
\chapter{Red Black Tree の実装} Left Learning Red Black Tree の実装において、 通常の言語であれば再起処理を用いて実装を行える部分を 継続にて実行可能なように変更する必要がある。 本節では、この課題に対して Gears Agda での Left Learning Red Black Tree の実装方法について述べる。 \section{Gears Agda での Red Black Tree の 記述} Gears Agda にて Red Black Tree を実装する際の手順を、 下\figref{rbt_imple}を参考に説明する。 \begin{figure}[H] \begin{center} \includegraphics[height=7.5cm]{pic/imple.pdf} \end{center} \caption{再起処理を回避する手順} \label{rbt_imple} \end{figure} 41の値を Left Leaning Red Black Tree に insert もしくは delete する際の手順を説明する。 まず Root node である 59 と比較した際に、41はそれより小さい。 この際、left node に遷移するが、CbC では再起処理が行えないため、listに保持していく。 順々に辿っていき、対象の場所に到達すると insert / delete を行う。 その後はlistからnodeを取り出し、結合することで Left Leaning Red Black Tree の操作を行う。 \subsection{定義した Data Gear の記述} Left Learning Red Black Tree の記述の際に、 Code Gear に渡している Data Gear である Env の記述を \coderef{env_imple} に示す。 \lstinputlisting[label=env_imple, caption=insertにて目的の nodeまで辿るプログラム, firstline=13, lastline=39] {src/agda/rbt_t.agda} 箇条書きにてそれぞれについて解説を行う。 \begin{itemize} \item col: 色のことで、red と black の data 型で記述し、パターンマッチを行う。 \item node: その名の通り node に格納されている値を保存する。 色と自然数が入る \item tree: tree の構造 を保存する。ここで node と x / right tree を持つ \item rbt: 上3つの要素を合わせて持つことで Left Learning Red Black Tree を定義する \item Env: rbt 以外に追加や削除を行う対象となる値と、 rbtを保存できる List を持つ Data Gear \end{itemize} \subsection{目的の node まで辿る Gears Agda} 上記に示した手順通りにAgdaで記述すると下 \coderef{insert_imple}のようになる。 例は insert を行う場合の記述となる。 \lstinputlisting[label=insert_imple, caption=insertにて目的の nodeまで辿るプログラム, firstline=157, lastline=166] {src/agda/rbt_t.agda} ソースコードの解説をする。上から3行はコメントで、この関数で行っていることを doに、 next / exit では4章で述べた次の関数遷移先を記載している。 5行目にて withを使用することで vart のパターンマッチを行っている。 vart が bt-empty である場合に 6行目が動作する。 bt-empty であれば node の一番下であるため、 varn を tree の値として insert して exit に遷移する。 7行目は vart が bt-empty ではないパターンの動作を記述している。 ここでは insertを行う値である varn と 現在いる位置の tree の値と比較を行い、 再度パターンマッチを行う。 8行目は比較した結果、同値だった場合であり、そのままexitに遷移している。 9行目は入力の値 varn の方が小さい場合を指している。 vart に left tree を入れ、varl には 現在の tree から left treeを除いた treeを追加している。それを next に遷移させている。 10行目は入力の値 varn の方が大きい場合を指している。 9行目とは逆に、vart に right tree を入れ、varl には 現在の tree から right treeを除いた treeを追加している。それをまたnext に遷移させている。 以上の手順により、目的の node まで辿っている。 \subsection{目的の node まで辿った後の Gears Agda} 目的の node にたどり着いた後、List に格納された tree と vart の結合を行う。 Gears Agda でそれを記述すると\coderef{mearge_imple}のようになる。 \lstinputlisting[label=mearge_imple, caption=insertにて目的の nodeまで辿るプログラム, firstline=145, lastline=155] {src/agda/rbt_t.agda} ソースコードの解説をする。 5行目にて with を使用して varl についてパターンマッチを行っている。 6行目が varl に何も入っていない場合で、実行終了のため exitに遷移している。 7行目は varl に何か入っていた場合で、ここでは varl に入っているものが 何であるのか8行目と合わせてパターンマッチを行っている。 ここでは varl に入っていたものが bt-empty であった場合について記述されている。 bt-emptyが入ってくることは実装上ありえないので、exitに遷移することで強制終了している。 8行目では varl に入っていたものが bt-empty ではなかった場合で、 それをxtreeと命名している。 ここで vart に入っている値と xtree に入っている値を比較を行い、 さらにパターンマッチを行う。 9行目が入っている値と同じ値であった場合で、 特に操作する必要がないので vart に xtree を入れ、 varl を一つ進める。 10行目は vartが大きい場合で、 varnに xtree の値を入れ、 xtree の right tree に 現在のvart を入れたものを vartにして varlを一つ進めている。 11行目は vartが小さい場合で、 10行目と逆のことをしている。 varnに xtree の値を入れ、 xtree の left tree に 現在のvart を入れたものを vartにして varlを一つ進めている。 以上の組み合わせを行い、 Gears Agda にて 再起処理を使わず に Left Learning Red Black Tree の insert / delete を 記述した。 % 以上のように Tree の基本操作である insert, find, delete の実装を行った。