annotate slide/slide.html @ 27:796c18a4aa0d

add slide
author tatsuki
date Sun, 12 Feb 2017 16:24:24 +0900
parents
children 222d98af3372
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
1 <!DOCTYPE html>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
2 <html>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
3 <head>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
4 <meta http-equiv="content-type" content="text/html;charset=utf-8">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
5 <title>修論予備審査Slide</title>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
6
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
7 <!--
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
8 Notes on CSS media types used:
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
9
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
10 1) projection -> slideshow mode (display one slide at-a-time; hide all others)
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
11 2) screen -> outline mode (display all slides-at-once on screen)
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
12 3) print -> print (and print preview)
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
13
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
14 Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
15
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
16 Questions, comments?
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
17 - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
18 -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
19
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
20 <!-- styles -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
21 <style media="screen,projection">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
22
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
23 html,
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
24 body,
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
25 .presentation { margin: 0; padding: 0; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
26
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
27 .slide { display: none;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
28 position: absolute;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
29 top: 0; left: 0;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
30 margin: 0;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
31 border: none;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
32 padding: 2% 4% 0% 4%; /* css note: order is => top right bottom left */
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
33 -moz-box-sizing: border-box;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
34 -webkit-box-sizing: border-box;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
35 box-sizing: border-box;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
36 width: 100%; height: 100%; /* css note: lets use border-box; no need to add padding+border to get to 100% */
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
37 overflow-x: hidden; overflow-y: auto;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
38 z-index: 2;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
39 }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
40
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
41 .slide.current { display: block; } /* only display current slide in projection mode */
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
42
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
43 .slide .stepcurrent { color: black; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
44 .slide .step { color: silver; } /* or hide next steps e.g. .step { visibility: hidden; } */
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
45
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
46 .slide {
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
47 /*
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
48 background-image: -webkit-linear-gradient(top, blue, aqua, blue, aqua);
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
49 background-image: -moz-linear-gradient(top, blue, aqua, blue, aqua);
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
50 */
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
51 }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
52 </style>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
53
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
54 <style media="screen">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
55 .slide { border-top: 1px solid #888; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
56 .slide:first-child { border: none; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
57 </style>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
58
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
59 <style media="print">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
60 .slide { page-break-inside: avoid; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
61 .slide h1 { page-break-after: avoid; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
62 .slide ul { page-break-inside: avoid; }
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
63 </style>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
64
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
65
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
66 <!-- add js lib (jquery) -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
67 <script src="js/jquery-1.7.min.js"></script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
68
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
69 <!-- S6 JS -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
70 <script src="js/jquery.slideshow.js"></script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
71 <script src="js/jquery.slideshow.counter.js"></script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
72 <script src="js/jquery.slideshow.controls.js"></script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
73 <script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
74 $(document).ready( function() {
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
75 Slideshow.init();
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
76
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
77 // Example 2: Start Off in Outline Mode
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
78 // Slideshow.init( { mode: 'outline' } );
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
79
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
80 // Example 3: Use Custom Transition
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
81 // Slideshow.transition = transitionScrollUp;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
82 // Slideshow.init();
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
83
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
84 // Example 4: Start Off in Autoplay Mode with Custom Transition
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
85 // Slideshow.transition = transitionScrollUp;
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
86 // Slideshow.init( { mode: 'autoplay' } );
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
87 } );
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
88 </script>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
89
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
90 </head>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
91 <body>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
92 <div class="layout">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
93 <div id="header"></div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
94 <div id="footer">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
95 <div align="right">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
96 <img src="image/concurrency.png" width="200">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
97 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
98 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
99 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
100
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
101 <div class="presentation">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
102
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
103 <!-- add slides here; example -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
104 <div id="header">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
105
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
106 <tr>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
107 <td><div align="center">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
108 <h1><font color="#808db5">ソフトウェア内部で使用するのに適した木構造データベースJungle</font></h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
109 <h2>琉球大学大学院 情報工学専攻 修士2年次 金川竜己</h2>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
110 <p>Feb 13, 2017</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
111 </div></td>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
112 </tr>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
113 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
114
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
115 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
116 <h1>研究の背景と目的</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
117 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
118 <p>プログラムからデータを分離して扱うデータベースには、プログラム中のデータ構造と表構造とのミスマッチという問題がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
119 <p>データベースのレコードをプログラム中のオブジェクトとして使えるOR Mapperや、データベース自体も、表に特化したKey Value Storeや、Jsonなどの不定形のデータ構造を格納するように機能拡張されてきている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
120 <p>しかし、プログラム中のデータは複雑な構造をメモリ上に構築しており、これらの方法でもまだギャップがある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
121 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
122 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
123
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
124 <!--
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
125 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
126 <h1>インピータンスミスマッチ</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
127 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
128 <p>プログラム中のデータ構造とRDBの表構造には大きなギャップがある。これはインピーダンスミスマッチと呼ばれている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
129 <p>例えばRPGゲーム中のユーザが持つアイテムという単純なものでも、RDBではユーザとアイテムの組をキーとする巨大な表として管理することになる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
130 <p>プログラム中では、ユーザが持つアイテムリストという簡単な構造を持つが、データのネスト構造を許さない第一正規形を要求するRDBとは相容れない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
131 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
132 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
133 -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
134
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
135
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
136 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
137 <h1>既存のDBが持つ問題点</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
138 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
139 <p>MySQLやPosgreSQLなどは、Jsonなどの不定形のデータ構造を格納するように機能拡張されるようになってきた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
140 <p>しかし、不定形の構造の変更をトランザクションとして、どのように処理するかはJsonの一括変更という形で処理されてしまっており、
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
141 並列処理が中心となってきている今のアプリケーションには向いていない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
142 <p>この拡張はRDBよりの拡張であり、
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
143 並列処理を含むプログラミングからの要請とのミスマッチが残っている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
144
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
145 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
146 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
147
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
148 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
149 <h1>既存のDBが持つ問題点</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
150 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
151 <p>データベース自体も、表に特化したKey Value Storeや、Jsonなどの不定形のデータ構造を格納するように機能拡張されてきている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
152 <p>その例としてCassandraや、mongoDBが挙げられる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
153 <p>しかし、プログラム中のデータは複雑な構造をメモリ上に構築しており、これらの方法でもまだギャップがある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
154 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
155 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
156
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
157
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
158 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
159 <h1>非破壊的木構造データベースJungle</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
160 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
161 <p>当研究室ではこれらの問題を解決するために木構造Jungleデータベースを提案している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
162 <p>Jungleは様々な構造のデータ(例えばXML/JSON/LIST)を木構造としてそのまま格納することが可能である。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
163 <p>Jungleではデータの変更を非破壊的、つまり元の木を保存しつつ、新しい木を構築する方法をとる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
164 <p>これにより木を参照しながら処理するタスクと木を変更するタスクを並列に処理することができる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
165 <p>プログラムは、この木を変更されないデータ構造として直接取り扱うことができる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
166 <p>名前付きの複数の木をatomicに入れ替えるのがJungleの transactionとなる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
167 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
168 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
169
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
170
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
171 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
172 <h1>Jungleの構造</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
173 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
174 <p>木は複数のノードの集合でできており、その木の集合によりJungleが構成されている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
175 <p>ノードは自身の子のリストと属性名と属性値の組でデータを持つ。これはデータベースのレコードに値する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
176 <p>通常のレコードと異なり、ノードは自身の子供を持つ。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
177 <p>親から子への片方向の参照しか持たない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
178 <embed src="../figures/multiComponent.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
179 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
180 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
181
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
182 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
183 <h1>JungleのTransaction</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
184 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
185 <p>データの変更は一度生成した木を上書きせず、ルートから変更を行うノードまでコピーを行い、新しく木構造を構築する。最後にルートをアトミックに入れ替えてコミットする。コミットが失敗した場合は最初からやり直す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
186 <embed src="../figures/non_destructive_tree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
187 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
188 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
189
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
190 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
191 <h1>Jungleの木</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
192 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
193 <p>Jungleは木を名前で生成、管理している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
194
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
195 <div style="padding: 10px; margin-bottom: 10px; border: 5px double #333333;">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
196 <pre><code class="language-Java">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
197 // Jungleに新しく木を生成する。木の名前が重複した場合、生成に失敗しnullを返す
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
198 JungleTree createNewTree(String treeName)
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
199
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
200 // JungleからtreeNameと名前が一致するtreeを取得する。名前が一致するTreeがない場合取得は失敗しnullを返す
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
201 JungleTree getTreeByName(String treeName)
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
202 </code></pre>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
203 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
204
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
205 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
206 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
207
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
208
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
209 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
210 <h1>Jungleの木の編集</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
211 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
212 <p>Jungleの木の編集はJungleTreeEditorクラスを用いて行われる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
213
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
214 <p>JungleTreeEditorクラスには編集を行うためのAPIが実装されている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
215
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
216 <p>また、ノードを指定して編集を行う際には、NodePathクラスを用いる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
217
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
218 <p>木の編集を行った後は、Commitを行い変更をPushする必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
219 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
220 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
221
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
222
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
223 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
224 <h1>NodePath</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
225 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
226 <p>Jungleでは木のノードの位置をNodePathを使って表す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
227 <p>ルートから対象のノードまでの経路を数字で指し示す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
228 <p>ルートノードは例外として-1と表記される。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
229 <p>NodePathクラスを用いて[-1,1,2,3]を表している例を以下に貼る。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
230 <embed src="../figures/nodepath.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
231 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
232 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
233
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
234
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
235
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
236
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
237 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
238 <h1>JungleTreeEditorのAPI</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
239 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
240 <p>JungleTreeEditorが提供している木の編集APIを以下に記す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
241 <div style="padding: 10px; margin-bottom: 10px; border: 5px double #333333;">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
242 <pre><code class="language-Java">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
243
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
244 </code></pre>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
245 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
246
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
247 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
248 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
249
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
250
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
251
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
252 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
253 <h1>Jungleの検索機能</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
254 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
255 <p>Jungleの木への検索は、木の走査を行うTraverserクラス内に実装してある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
256
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
257 <p>属性名key 属性値valueの組を使用して検索を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
258
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
259 <p>以下に検索を行う関数findの定義を記述する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
260
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
261 <div style="padding: 10px; margin-bottom: 10px; border: 5px double #333333;">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
262 <pre><code class="language-Java">public Iterator&lt;TreeNode&gt; find(Query query, String key, String value);
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
263 </code></pre>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
264 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
265
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
266 <p>関数findは引数に、Query query、String key、String valueの3つの引数を取り、条件に一致したノードのIteratorを返す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
267
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
268 <p>第1引数には、探索の条件を記述する関数boolean comdition(TreeNode)を定義したInterface Queryを、第2、第3引数の、String key、String valueはIndexを用いた絞込みに使用する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
269
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
270
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
271 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
272 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
273
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
274 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
275 <h1>Jungleの問題点</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
276 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
277 <p>これまでに記述したAPIにより、Jungleはデータの書き込み、読み込みを行える。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
278 <p>しかし、性能はあまり良いものではなかった。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
279 <p>特にIndexを用いた検索が明らかに遅く、検索の手間がO(n^2)となっていた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
280 <p>本来ならIndexを使った場合の検索の手間はO(Log n)であるべきである。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
281 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
282 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
283
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
284
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
285 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
286 <h1>JungleのIndexが遅い原因</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
287 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
288 <p>Jungle では、今まで Java 上で関数型プログラミングが行えるライブラリ、Functional Java の TreeMap を使用して、Index を実装していた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
289 <p>しかし、Functional Java の TreeMap は、採用しているアルゴリズムが悪かった。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
290 <p>またコードの量も膨大であり、修正も困難だった。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
291 <p>そこで、自分で、同じ機能を持つ 非破壊 TreeMap を実装することにした。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
292 <p>TreeMap アルゴリズムは赤黒木を採用した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
293 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
294 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
295
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
296
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
297 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
298 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
299 <h1>Indexに非破壊TreeMapを採用している理由</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
300 <p>Jungleは過去の版の木を全て保持している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
301 <p>過去の木に対する検索もサポートしている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
302 <p>木の版毎にIndexを持っている必要がある</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
303 <p>破壊的TreeMapでは、木に更新が入るたびに新しいIndexを作り直す必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
304 <p>Indexの更新の手間がO(n)になってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
305 <p>非破壊TreeMapの場合、一度作られたTreeMapに対して編集を行うと、編集後のTreeMapを返す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
306 <p>その際、編集前のTreeMapのデータは破壊されることはない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
307 <p>また、過去のIndexとデータを共有している</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
308 <p>複数のversionのIndexがあっても、データの差分しかメモリは消費されない</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
309 <p>メモリの使用量を抑えつつ複数のversionでIndexを保持できる</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
310 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
311 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
312
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
313
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
314 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
315 <h1>赤黒木とは</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
316 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
317 <p>赤黒木とは、二分探索木の一つで、以下の条件を満たした木のことである</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
318 <ul>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
319 <li>全てのノードは赤か黒の色を持つ</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
320 <li>ルートノードの色は黒</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
321 <li>全ての葉の色は黒</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
322 <li>赤いノードの子の色は黒</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
323 <li>全ての葉からルートまでの経路には同じ個数の黒いノードがある</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
324 </ul>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
325 <p>赤黒木は、上記の条件を満たしている限りデータの検索、削除、探索をO(Log n)で行える。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
326 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
327 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
328
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
329 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
330 <h1>Jungleの問題点2</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
331 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
332 <p>非破壊のTreeMapを実装したことにより、読み込みは極めて高速に行えるようになった。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
333 <p>しかし、書き込みに関してはまだ十分な速度が出ていない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
334 <p>Jungleの木の編集時に特に問題になっているのは、主に次の三点である。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
335 <ul>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
336 <li>Indexの更新が、毎回フルアップデートしているため更新の手間がO(n)となっている。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
337 <li>線形の木を更新する際、Jungleは全てのノードの複製を取ってしまうため、更新の手間がO(n)となってしまう</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
338 <li>木のノード数が増えると、バランスが取れていない場合木の更新が重くなる。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
339 </ul>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
340 <p>以降これらの問題について述べていく。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
341 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
342 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
343
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
344 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
345 <h1>Indexの差分アップデート</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
346 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
347 <p>JungleではIndexの更新を行う際、毎回新しいIndexを構築していた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
348 <p>その為、毎回O(n)のIndexの更新が入っていた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
349 <p>Indexの差分アップデートを実装することで、Indexの更新の手間をO(Log n)とする。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
350 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
351 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
352
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
353 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
354 <h1>Indexの差分アップデートの実装</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
355 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
356 <p>Jungleは木の編集を行う際、編集を行うノードからルートまでの経路のノードの複製を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
357 <p>そのため、編集後の木には存在しない、複製前のノードがIndexに残ってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
358 <p>それらのノードをIndexから削除し、複製後のノードを登録する必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
359 <embed src="../figures/non_destructive_tree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
360 <p>この図だと、Indexの更新時にroot、2、5をIndexから削除する必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
361 <p>その後新しく作られたノードを登録することでIndexの更新は完了する</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
362 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
363 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
364
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
365 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
366 <h1>複製前のノードのdelete</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
367 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
368 <p>複製前のノードをIndexから削除するためには、編集を行ったノードを覚えておく必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
369 <p>Editorの中に編集を加えたノードを格納するリストを定義した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
370 <p>Indexのアップデート時にリストを使用する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
371 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
372 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
373
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
374
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
375 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
376 <h1>複製前のノードのdelete</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
377 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
378 <p>複製前のノードは以下の手順で行われる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
379 <ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
380 <li>編集を行ったノードのリストからノードを取得する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
381 <li>取得したノードが、保持している値をIndexから削除する。 </li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
382 <li>自身と子供のペアを ParentIndex から削除する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
383 <li>ParentIndexから自身の親を取得する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
384 <li>2 - 4 をルートノードにたどり着くか、ParentIndex から親を取得できなくなるまで続ける。 </li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
385 <li>1 - 5 をリストからノードが無くなるまで続ける。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
386 </ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
387 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
388 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
389
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
390 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
391 <h1>編集前のノードのdeleteの例1</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
392 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
393 <p>ノードD、Eを編集した後の、複製前のノードをIndexから削除する例を記述する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
394 <p>黒のノードは編集後の木に存在しないノード。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
395 <p>赤のノードはIndexから削除が終了したノード。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
396 <p>その他のノードは緑とする。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
397 <br>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
398 <p>編集前ノードのDelete前</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
399 <embed src="../figures/indexUpdate.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
400 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
401 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
402
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
403 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
404 <h1>編集前のノードのdeleteの例2</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
405 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
406 <p>ノードDについての削除後</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
407 <embed src="../figures/indexUpdate2.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
408 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
409 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
410
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
411 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
412 <h1>編集前のノードのdeleteの例3</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
413 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
414 <p>ノードEについての削除後</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
415 <embed src="../figures/indexUpdate3.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
416 <p>このようにIndexからのノードの削除は行われる</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
417 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
418 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
419
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
420
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
421 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
422 <h1>ノードのIndexへの追加</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
423 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
424 <p>Indexへのノードは以下の手順で行われる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
425 <ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
426 <li>木からルートノードを取得する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
427 <li>取得したノードがIndexに登録されているかを調べる。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
428 <li>登録されている場合、そのノード以下のSubTreeは、全てIndexに登録されているので、次のノードに移動する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
429 <li>登録されていなかった場合、自身が保持している値をIndexに登録する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
430 <li>自身と子ノードを Parent Index に登録する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
431 <li>自身の子ノードを取得したノードとして2に戻る。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
432 <li>全てのノードを登録したら終了する。</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
433 </ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
434 <p>ノードの登録は深さ優先探索と同じ順序で行っていく。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
435 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
436 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
437
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
438 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
439 <h1>ノードのIndexへの追加例</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
440 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
441 <p>ノードD、Eを編集した後の、複製前のノードをIndexから削除する例を記述する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
442 <p>赤のノードはIndexに存在しないノード。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
443 <p>緑のノードはIndexに追加されているノード。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
444 <br>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
445 <p>以下の図の場合、A、B,D、Eの順に登録され、Cで終了する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
446 <embed src="../figures/indexUpdate3.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
447
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
448 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
449 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
450
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
451
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
452 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
453 <h1>線形の木の構築</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
454 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
455 <p>Jungleは木の編集時、ルートから編集を行う位置までのノードの複製を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
456 <p>そのため、木の編集の手間は木構造の形によって異なる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
457 <p>特に線形の木の場合、全てのノードの複製を行うため変更の手間がO(n)となってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
458 <p>Jungleは線形の木をO(1)で変更するPushPopの機能を持つ。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
459 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
460 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
461
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
462 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
463 <h1>PushPop</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
464 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
465 <p>PushPopはルートノードの上に新しいルートを追加するAPIである。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
466 <p>しかし、PushPopで構築した木は逆順になってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
467 <p>そのため、正順の木を構築する際は使用できない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
468 <embed src="../figures/PushPopDemerit.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
469 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
470 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
471
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
472 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
473 <h1>Differential Jungle Tree</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
474 <font size=5>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
475 <p>正順の木をO(1)で構築するために実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
476 <p>Differential Jungle Treeは木のバージョン毎に自身の木の最後尾のノードを持つ。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
477 <embed src="../figures/findDifTree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
478 <p></p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
479 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
480 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
481
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
482 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
483 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
484 <h1>Differential Jungle Treeの作成</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
485 <p>Differential Jungle Treeを作成するためにJungleに新しいAPIを実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
486 <div style="padding: 10px; margin-bottom: 10px; border: 5px double #333333;">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
487 <pre><code class="language-Java"> JungleTree createNewDifferenceTree(String treeName);
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
488 </code></pre>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
489 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
490 <p>上記のAPIは、treeNameで指定した名前のDifferential Jungle Treeを構築する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
491 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
492 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
493
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
494 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
495 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
496 <h1>Differential Jungle Treeの編集</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
497 <p>Differential Jungle Treeの木の編集は、Differential Jungle Tree Editorを用いて行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
498 <p>既存のDefault Jungle Treeは、木の複製を作った後編集を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
499 <p>Differential Jungle Tree Editorは、自身がSub Treeを持っている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
500 <p>Sub Tree に対して編集を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
501 <p>Commit時に自身が保持している末尾ノードにSub TreeをAppendすることで木の編集を終了する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
502 <p>また、Diffirential Jungle Treeの編集は、Editorが持つSub Treeへの編集しか行えないため、一度Commitした木に対して変更を加えることはできない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
503 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
504 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
505
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
506 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
507 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
508 <h1>Differential Jungle Treeの編集の例</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
509 <p>Differential Jungle Treeの編集例を以下の図に記す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
510 <embed src="../figures/EditDifferencialTree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
511 <p></p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
512 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
513 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
514
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
515 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
516 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
517 <h1>Differential Jungle Treeの検索</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
518 <p>Differential Jungle Treeは末尾ノードを使って現在の木構造を表現している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
519 <p>過去の木に対してIndexを使わないで全探索を行った場合、既存の検索ではその版に存在しないはずのノードが取得できてしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
520 <embed src="../figures/findDifTree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
521 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
522 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
523
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
524 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
525 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
526 <h1>Differential Jungle Treeの検索例</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
527 <p>以下の図の場合Tree Ver1を全探索すると、存在しないはずのノード3、4が取得できてしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
528 <embed src="../figures/findDifTree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
529 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
530 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
531
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
532 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
533 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
534 <h1>Differential Interface Traverserの実装</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
535 <p>この問題を解決するためにDifferential Interface Traverserを実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
536 <p>これは、末尾ノード以下を検索対象から取り除く検索を持つ。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
537 <p>Indexを使った検索の場合、各版ごとに独立したIndexを持つため、Default Jungle Treeと同じ検索でも問題ない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
538 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
539 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
540
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
541 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
542 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
543 <h1>Differential Jungle Treeの整合性</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
544 <p>Default Jungle TreeへCommitは編集後の木のルートをAtomicに入れ替えることで行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
545 <p>しかしDifferential Jungle Treeは、ルートの入れ替えと、Editorが持つ木構造の末尾ノードへのAppendの2つのプロセスからなる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
546 <p>ルートの入れ替えに関しては、Default Jungle Treeと同じように行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
547 <p>Editorが持っている木構造の末尾ノードへのAppendは、ルートの入れ替えに成功した場合のみ行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
548 <p>そうすることで、別Threadで行われているCommitと競合した際に、ルートを入れ替えたThreadと別ThreadがAppendを行い木の整合性が崩れることを回避している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
549 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
550 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
551
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
552 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
553 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
554 <h1>Differential Jungle Treeの整合性2</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
555 <p>Differential Jungle Treeでは、過去の版の木に対して変更を加えた際に木の整合性が崩れてしまう問題もある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
556 <p>図の中の、過去の木であるTree ver1に対してノード5を追加してCommitした場合、新しい木Tree ver`2が生成される。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
557 <embed src="../figures/badDifTree3.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
558
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
559 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
560 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
561
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
562 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
563 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
564 <h1>Differential Jungle Treeの整合性3</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
565 <p>Tree ver`2に対してIndexを使わないで検索を行った場合、本来存在しないはずのノード3、4が検索対象に入ってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
566 <p>これは、Tree ver1の末尾ノードが2つ子を持っているせいで発生する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
567 <p>この問題を解決するために、過去の木に対する変更は禁止した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
568 <embed src="../figures/badDifTree2.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
569 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
570 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
571
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
572 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
573 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
574 <h1>Jungle上での巨大な木の扱い。</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
575 <p>Jungleは木の編集時、ルートから編集を行う位置までのノードの複製を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
576 <p>そのため、木の編集の手間は木構造の大きさにも依存している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
577 <p>バランスの取れた木構造を構築することで、編集の手間をO(Log n)にすることは可能ではある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
578 <p>しかし、ユーザーが木の構造を把握しバランスを取るのは難しい。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
579 <p>そこで、自動で木のバランスを取り、最適な木構造を構築する機能を持つRed Black Jungle Treeを実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
580 <p>Red Black Jungle Treeは、自動でバランスを取ってしまうため、木構造の形でデータを表現することはできない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
581 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
582 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
583
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
584 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
585 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
586 <h1>Red Black Jungle Treeの作成</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
587 <p>Red Black Jungle Treeを作成するためにJungleに新しいAPIを実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
588 <div style="padding: 10px; margin-bottom: 10px; border: 5px double #333333;">
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
589 <pre><code class="language-Java"> JungleTree createNewRedBlackTree(String treeName,String balanceKey);
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
590 </code></pre>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
591 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
592 <p>上記のAPIは、treeNameで指定した名前のRed Black Jungle Treeを構築する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
593 <p>また、第二引数のbalanceKeyを用いて木のバランスを取る。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
594 <p>第二引数のbalanceKeyを使用して、検索することでO(Log n)で検索を行うことができる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
595 <p>なので、別途Indexを構築する必要はない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
596 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
597 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
598
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
599
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
600 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
601 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
602 <h1>NodePathの拡張</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
603 <p>Red Black Jungle Treeは、ノードを追加、削除するたびに木のバランスが行われるため、各ノードのPathが変わってしまう。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
604 <p>その為、編集を加える際に、編集対象のノードのPathを調べる必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
605 <p>その問題を解決するために、ノードを数値ではなく属性名と属性値の組でノードを指定できるようにした。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
606 <p>ノードの指定に使用する属性名は、Red Black Jungle Treeの第二引数で指定したbalanceKeyを使用する必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
607 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
608 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
609
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
610 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
611 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
612 <h1>Red Black Jungle Treeの検索</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
613 <p>Red Black Jungle TreeはIndexを持たないため既存の検索は使用できない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
614 <p>木の生成時に指定したbalanceKeyを使用して、O(Log n)で探索を行う検索を実装した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
615 <p>また、balanceKeyを使用しない場合は、既存のDefault Jungle Treeと同じで全探索を行うのでO(n)となる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
616 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
617 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
618
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
619
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
620
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
621 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
622 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
623 <h1>新たに追加した要素の評価</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
624 <p>Jungleに新しく追加した機能の性能測定を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
625 <p>新しく実装したTreeMapとFunctionalJavaのTreeMap</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
626 <p>IndexのFullアップデートと差分アップデート</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
627 <p>Default Jungle TreeとDefferential Jungle Tree</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
628 <p>Default Jungle Tree と Red Black Jungle Tree</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
629 <p>最後に既存のDBであるPostgreSQLとMongoDBとJungleの比較を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
630 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
631 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
632
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
633
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
634
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
635 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
636 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
637 <h1>TreeMapの測定</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
638 <p>比較対象には、 TreeMap 実装前に Jungle で使用していた Functional Java の TreeMap を使用する。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
639 <p> TreeMap に1000回の Get を行った際のグラフである。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
640 <!--
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
641 <p>X 軸は Get を行う TreeMap のノード数。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
642 <p>Y 軸は Get にかかった時間を表す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
643 -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
644 <embed src="../result/treemap/find.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
645 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
646 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
647
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
648
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
649
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
650 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
651 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
652 <h1>TreeMapの測定の考察</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
653 <p>新たに実装したTreeMapの方が極めて高速な検索を行えている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
654 <p>理由として、JungleのTreeMapは二分探索木の探索アルゴリズムで探索するのに対して、Functional Javaは検索対象のノードがルートになる木を再構築し、ルートを返すといったアルゴリズムのを採用しているからである</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
655 <p>また、データのInsertは、ほぼ同じ速度、DeleteはJungleの方が極めて高速に行えていた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
656 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
657 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
658
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
659 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
660 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
661 <h1>Indexの差分アップデートの測定</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
662 <p>比較対象は、IndexのFullアップデートとする。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
663 <p>測定は木にノードを追加、Commitを1 セットの変更として行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
664 <!--
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
665 <p>X 軸は、木に行った変更のセット数。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
666 <p>Y 軸は、木の構築にかかった時間を表す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
667 -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
668 <embed src="../result/createIndex.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
669 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
670 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
671
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
672 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
673 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
674 <h1>Indexの差分アップデートの測定の考察</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
675 <p>IndexのFullアップデートに比べて差分Updateの方が高速に木の構築に成功している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
676 <p>期待通りの性能が出たといえる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
677 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
678 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
679
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
680 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
681 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
682 <h1>正順の線形木の構築時間の測定</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
683 <p>Differential Jungle Treeの性能測定を行う。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
684 <p>比較対象はDefault Jungle Treeを選択した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
685 <p>また、木の構築時間を測るためにIndexを構築していない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
686 <!--
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
687 <p>X軸は構築した木のノード数。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
688 <p>Y 軸は構築にかかった時間を表す。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
689 -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
690 <embed src="../result/createListTree.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
691 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
692 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
693
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
694 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
695 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
696 <h1>正順の線形木の構築時間の考察</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
697 <p>Commit毎に全てのノードの複製を行うDefault Jungle Treeに比べて、木の複製を行わないDifferential Jungle Treeが早いのは当然だといえる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
698 <p>期待通りの性能が出た。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
699 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
700 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
701
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
702 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
703 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
704 <h1>Red Black Jungle Tree の測定</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
705 <p>比較対象は、Default Jungle Treeを選択した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
706 <embed src="../result/createRedBlackTreeAndDefaultTreeTime.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
707 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
708 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
709
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
710 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
711 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
712 <h1>Red Black Jungle Tree の測定の考察</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
713 <p>Red Black Jungle Treeは自身の木の形がIndexと同じ働きを持っている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
714 <p>なのでIndexを木の編集時作る必要がない。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
715 <p>Commit のたびにIndexを作っているDefault Jungle Treeより早くなるのは当然だといえる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
716 <p>期待通りの性能が出た。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
717 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
718 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
719
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
720 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
721 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
722 <h1>既存のDBとJungleの比較</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
723 <p>比較対象はMongoDBとPostgreSQLを選択した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
724 <p>PostgreSQLはJson形式でデータを格納している。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
725 <p>データの検索速度を比較した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
726 <embed src="../result/comparedb.pdf" width="800" height="500"/>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
727 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
728 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
729
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
730 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
731 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
732 <h1>既存のDBとJungleの比較の考察</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
733 <p>MongoDBとPostgreSQLは、プログラム外にあるデータベースに通信を用いてアクセスしている。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
734 <p>Jungleは、メモリの中にデータを持ち通信を使わずデータにアクセスできる。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
735 <p>期待通りの性能が出た。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
736 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
737 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
738
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
739
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
740
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
741 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
742 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
743 <h1>まとめ</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
744 <p>Jungleの性能を向上させるために新たな要素を追加した。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
745 <ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
746 <li>非破壊TreeMap</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
747 <li>Indexの差分アップデート</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
748 <li>Differential Jungle Tree</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
749 <li>Red Black Jungle Tree</li>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
750 </ol>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
751 <p>実装後の測定では、全てが既存の木と比べて高速に動いていた。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
752 <p>また、Jungleは既存のDBと比較しても、極めて高速な検索が行えることがわかった。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
753 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
754 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
755
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
756
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
757 <div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
758 <font size=6>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
759 <h1>今後の課題</h1>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
760 <h2>木の設計手法の確立</h2>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
761 <p>JungleはRDB と異なり格納するデータの自由度は大きい。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
762 <p>どのようなデータ構造も設計を行わずに格納することが可能である。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
763 <p>十分なパフォーマンスを出すためには、データを最適化する必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
764 <p>最適な木構造はアプリケーションによって違うため、Jungle の設計手法を確立させる必要がある。</p>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
765 </font>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
766 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
767
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
768
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
769
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
770 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
771
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
772
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
773
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
774 </div>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
775
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
776 </div> <!-- presentation -->
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
777 </body>
796c18a4aa0d add slide
tatsuki
parents:
diff changeset
778 </html>