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 の実装を行った。