13
関東第32回Cocoa勉強会 2009/2/7 表形式のデータに 順序を記録する方法 新居雅行 [email protected] 1

Cocoa勉強会#32-表形式のデータに順序を記録する方法

Embed Size (px)

Citation preview

関東第32回Cocoa勉強会2009/2/7

表形式のデータに順序を記録する方法

新居雅行[email protected]

1

Agenda

•現状の順序の記録方法と問題点•順序を記録するコード付け•コード付け手法の問題点と改良

2

順序記録に対する問題点•問題が発生する場合•順序の手がかりになるフィールドがない場合•例えば、ユーザが順序を決めるような場合•一般的な方法•数値の番号を利用した場合、挿入時に順番の数値を更新する必要がある•リンクリスト形式の場合、2つのレコードの順序比較でもリストをたどる

必要がある

順番 メモ1 レンタルDVD返却2 プリンタの修理3 B5用紙の購入4 山田君に電話連絡5 問合せメール対応

中間にデータを挿入する場合、「順番」フィールドの管理が複数のレコードに及ぶ

3

順序の記録手法

•記録手法への要求•データに順位を与えるためのラベルへを付与する•ラベルを元に、比較やソートができれば良い•データベースやフレームワークで利用できる•実現できれば…•レコードを挿入した場合、そのレコードにラベルをつけるだけで他のレコードを変更しない方法が有効

•効率化、マルチユーザ、O/Rマッピングによるフレームワークのキャッシュ等で、よりシンプルに順序を記録できる

4

VLEIコードの解釈

•VLEIコード•Variable Length Endless Insertable code)•東京工業大学の横田先生を中心にXMLのラベル付けに関する論文がある •順序を記録するための2進数によるラベル•あるラベルより前のラベルは0を続ける、後は1を続ける•2分木として表現可能で、ノードが1つ1つのラベルに対応•末尾に連続してレコードを追加するような場合などで、桁数が急速に増大する

5

実際のバイナリデータ

101と1011の間に10110が存在する

ソート後 生成順

6

バイナリ表現=2分木

•ラベルは2分木のノードのどれかとなる•集合論的には { 0, φ, 1 } の集合の直積•中間ラベルを求める問題•部分木の間順走査で得られるノードのどれか•一般には短いものを使うといいと思うかもしれない•だが、実験してみると、「いちばん長いもの」でも大して変わらない

000

00

001

0

010

01

011

ɸ

100

10

101

1

110

11

111

7

問題点と解決手法

•コード生成の規則として次の手法を提案•隣接ノードの場合、延長したノードから採用•隣接しないノードの場合、桁が長いものにいちばん近いノードを採用•特定のレコードの直後に連続挿入する場合の比較•XとYがあり、Xの直後にレコードを連続追加した場合、A~Dのノードが割り当てられる

1

110

11 1101

VLEIの場合 改良手法の場合

11001

X

AY

B

C

D

1100

1

110

11

X

A

Y

BC

D

110011000

110000

8

改良手法によるラベル付け

•末尾にレコードを追加した場合

9

延長手法の一提案•隣接ノードの中間を求める場合の延長ノードを一般化•本来延長する方向=AとBの中間であれば、Bに対して0を付加•さらに、本来の方向にf個延長し、逆方向にe個分延長する•先頭と末端に追加する場合•末端に追加する場合に最後のラベルが1のみで構成されている場合•1を f+1 個追加し、0をe個追加する•先頭に追加する場合に最初のラベルが0のみで構成されている場合 •0を f+1 個追加し、1をe個追加する

A

B

f e

e + f

10

順序記録手法の実験結果

•500レコード生成•ランダムに30、連続して20レコードを生成。これを10回繰り返す

•20回の平均値•e=0, f=0と比較•一部の条件では、平均桁数、平均最大桁数は減少する

!"!# $!"!# %!"!# &!"!# '!"!# (!!"!#

)*!+,*!#

,*!#

,*(#

,*$#

,*-#

,*%#

!"!# $!"!# %!"!# &!"!# '!"!# (!!"!#

)*!+,*!#

,*!#

,*(#

,*$#

,*-#

,*%#

!"!# $!"!# %!"!# &!"!# '!"!# (!!"!#

,*!#

,*(#

,*$#

,*-#

,*%#

f=0

f=1

f=2

平均桁数平均最大桁数

130.2

A

B

f e

e + f

11

記録のためのコード化

•{0, φ, 1} をそれぞれ、0, 1, 2とした3進数を利用

•4ビットごとにアルファベットに置き換える•81通りあり得るが、φは末尾から連続したものしか存在しないので、結果的には、31通りしかない

•0~9、A~Uを割り当てれば良い•ソート時の問題•比較するデータのすべての桁を揃えないといけない

•最大桁数に合わせてその場で生成が必要12

現在開発しているもの

•開発したもの•C言語のコマンドレベルでの中間ノードを求めるもの•文字によるコード表現を生成するコマンド•FileMaker Proによる検証システム

•まとめ•VLEIコードとその改良手法は、順序の記録として利用可能•文字へのコード化を行うことで、 データベースに適用する事も可能

13