annotate indexupdate.tex @ 16:33f56478f7a4

commit
author tatsuki
date Thu, 09 Feb 2017 18:32:01 +0900
parents 33d8077a5d45
children d5306971efbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
tatsuki
parents:
diff changeset
1 \chapter{Indexの差分Update}
15
tatsuki
parents: 13
diff changeset
2 Jungleの木はIndexを持っており、木のCommit時にFull Updateを行っている。
tatsuki
parents: 13
diff changeset
3 そのため、Commitを行うたびO(n)のIndexのUpdateが入り、木の編集時大きなネックとなっていた。
tatsuki
parents: 13
diff changeset
4 なので、高速にIndexの更新を行うため、Index の差分アップデートを実装した。
2
tatsuki
parents:
diff changeset
5
tatsuki
parents:
diff changeset
6 \section{差分 Updateの実装}
16
tatsuki
parents: 15
diff changeset
7 Jungle は木の編集を行う際に、編集を行うノードと、経路にあるノードの複製を行い新しい木構造を構築するため、
tatsuki
parents: 15
diff changeset
8 Index の中には、編集後の木には存在しない複製前のノードが残ってしまう。
tatsuki
parents: 15
diff changeset
9 なので、Index の差分 Update を行う際には、それらのノードを Index から削除して、新しく複製されたノードを Index に登録する必要がある。
tatsuki
parents: 15
diff changeset
10
tatsuki
parents: 15
diff changeset
11 そのためには、編集を行ったノードを覚えておく必要がある。
15
tatsuki
parents: 13
diff changeset
12 そこで、Jungle Tree Editor 内に、編集を加えたノードを覚えておくためのリストを定義した。
tatsuki
parents: 13
diff changeset
13 Editor は、木に編集を加えたら、リストに編集前のノードを保存する。
16
tatsuki
parents: 15
diff changeset
14 そして、Commit 時にリストにあるノードを使って Index の中に残っている、編集後の木に存在しないノードを削除する。
tatsuki
parents: 15
diff changeset
15 その後、新しく作られたノードを Index に登録して Update は終了する。
2
tatsuki
parents:
diff changeset
16
tatsuki
parents:
diff changeset
17
16
tatsuki
parents: 15
diff changeset
18 \section{編集前のノードの削除}
6
tatsuki
parents: 2
diff changeset
19 IndexのUpdateを行う際、初めに、編集後の木に存在しないノードをIndexから削除する。
2
tatsuki
parents:
diff changeset
20 削除の対象は、変更を加えたノードと、ルートから変更を加えたノードまでの経路にあるノードである。
tatsuki
parents:
diff changeset
21 ノードの削除は、以下の手順で行われる。
tatsuki
parents:
diff changeset
22
tatsuki
parents:
diff changeset
23 \begin{enumerate}
tatsuki
parents:
diff changeset
24 \item 編集を行ったノードのリストからノードを取得する。
6
tatsuki
parents: 2
diff changeset
25 \item 取得したノードが、保持している値をIndexから削除する。
2
tatsuki
parents:
diff changeset
26 \item 自身と子供のペアを ParentIndex から削除する。
tatsuki
parents:
diff changeset
27 \item ParentIndex から親を取得する。
6
tatsuki
parents: 2
diff changeset
28 \item 2 - 4をルートノードにたどり着くか、ParentIndexから親を取得できなくなるまで続ける。
tatsuki
parents: 2
diff changeset
29 \item 1 - 5をリストからノードが無くなるまで続ける。
2
tatsuki
parents:
diff changeset
30 \end{enumerate}
tatsuki
parents:
diff changeset
31
16
tatsuki
parents: 15
diff changeset
32 Parent Index から値が取得できない場合は、自身からルートまでの経路にあるノードは Index から削除されていることが保証されているため、削除を終えて、リストに入っている次のノードの削除処理を行っても構わない。
15
tatsuki
parents: 13
diff changeset
33
tatsuki
parents: 13
diff changeset
34
2
tatsuki
parents:
diff changeset
35
tatsuki
parents:
diff changeset
36 \section{Indexへのノードの挿入}
6
tatsuki
parents: 2
diff changeset
37 Indexから不要なノードを削除した後は、新しく作られたノードをIndexに挿入する。
2
tatsuki
parents:
diff changeset
38 ノードの挿入は、以下の手順で行われる。
tatsuki
parents:
diff changeset
39
tatsuki
parents:
diff changeset
40 \begin{enumerate}
tatsuki
parents:
diff changeset
41 \item 木からルートノードを取得する。
tatsuki
parents:
diff changeset
42 \item 取得したノードがIndexに登録されているかを調べる。
tatsuki
parents:
diff changeset
43 \item 登録されている場合、そのノード以下のSub Treeは、全てIndexに登録されているので、次のノードに移動する。
6
tatsuki
parents: 2
diff changeset
44 \item 登録されていなかった場合、自身が保持している値をIndexに登録する
tatsuki
parents: 2
diff changeset
45 \item 自身と子ノードをParent Index に登録する。
16
tatsuki
parents: 15
diff changeset
46 \item 自身の子ノードを取得したノードとして2に戻る。
tatsuki
parents: 15
diff changeset
47 \item 全てのノードを登録したら終了する。
2
tatsuki
parents:
diff changeset
48 \end{enumerate}
tatsuki
parents:
diff changeset
49
tatsuki
parents:
diff changeset
50
tatsuki
parents:
diff changeset
51 \section{Full Update との使い分け}
tatsuki
parents:
diff changeset
52 Indexの差分Updateは、不要なノードの削除と新しく木に追加されたノードの挿入を行っているため、1ノードに対する処理は Full Updateより大きい。
13
tatsuki
parents: 6
diff changeset
53 少ない回数編集を行った後の Commit は、差分Updateの方が高速に行えるが、多くの編集を行った後の Commitだと、Full Updateの方が高速に動作する可能性がある。
tatsuki
parents: 6
diff changeset
54 これに関しての検証は、性能測定の章に記述する。
2
tatsuki
parents:
diff changeset
55
tatsuki
parents:
diff changeset
56 \newpage