SlideShare a Scribd company logo
1 of 27
Download to read offline
ダブル配列 の 豆知識
矢田 晋
@s5yata
2013/9/1
1
ダブル配列の豆知識 #DSIRNLP
自己紹介
 経緯
 大学ではダブル配列の研究をしていた
 ダブル配列は 10 回以上実装した
 実績
 Darts-clone
 Darts(Double-ARray Trie System)のクローン
 トライだったりトライじゃなかったり
2013/9/1 ダブル配列の豆知識 #DSIRNLP
2
あらすじ
 トライとダブル配列
 トライ = 抽象データ構造
 ダブル配列 = トライの実装
 ダブル配列の豆知識
 実装の基本
 更新時間の短縮
 検索速度の向上
 空間効率の向上
2013/9/1
3
ダブル配列の豆知識 #DSIRNLP
トライとダブル配列
 トライ
 文字列をキーとする連想配列の実装
 キーの一部をラベルとする木構造
 情報検索や自然言語処理における用途
 基礎語彙やキーワードの辞書化
 ダブル配列
 配列ベースのトライ実装
 配列 BASE, CHECK [, TAIL]
2013/9/1 ダブル配列の豆知識 #DSIRNLP
4
トライ
 ラベル付きの木構造
 ラベルは節点もしくは枝に貼り付ける
 経路上のラベルをつなげると文字列になる
 終端ラベル(‘$’)を入れると実装しやすい
2013/9/1 ダブル配列の豆知識 #DSIRNLP
5
N
U
M A
L L P T R
O T
R
$
$
$
$
$
ダブル配列
 配列によるトライの実装
 BASE = 子ノード番号へのオフセット
 子ノード番号 = オフセット + ラベル
 CHECK = 親ノード番号
2013/9/1 ダブル配列の豆知識 #DSIRNLP
6
0 1 2 3 4 5 6 7 …
BASE 3 …
CHECK 1 1 …
オフセット + ラベル
実装の基本
2013/9/1 ダブル配列の豆知識 #DSIRNLP
7
内部データ構造
 理論的構成
 Array<BASE>, Array<CHECK>
 BASE, CHECK の参照で個別にキャッシュミス
 現実的構成
 Node = { BASE, CHECK }
 Array<Node>
 Node がキャッシュラインに収まる
 キャッシュミスを半減できる
2013/9/1 ダブル配列の豆知識 #DSIRNLP
8
演算方法
 排他的論理和の方が実装しやすい
 BASE = 子ノード番号へのオフセット
 子ノード番号 = オフセット ⊕ ラベル
 排他的論理和の利点
 オーバーフローとアンダーフローの不安がない
 ダブル配列をブロック単位で管理できる
 ラベルが 8-bit のときブロックの大きさは 256
2013/9/1 ダブル配列の豆知識 #DSIRNLP
9
末尾文字列の圧縮
 TAIL
 根から直近の分岐までの文字列をまとめる
 ノードの削減によりメモリ使用量が減る
 動的なダブル配列では隙間が気になる
2013/9/1 ダブル配列の豆知識 #DSIRNLP
10
N
U
M
L L P
O T
R
$
$
$
A$
TR$
更新時間の短縮
2013/9/1 ダブル配列の豆知識 #DSIRNLP
11
使いまーす
入ってまーす
更新の手順
 入力文字列に対する経路を確認
 なければ追加する
 使おうとした Node が使えないとき(衝突)
2013/9/1 ダブル配列の豆知識 #DSIRNLP
12
0 1 2 3 4 5 6 7 …
Node …
0 1 2 3 4 5 6 7 …
Node …
入ってまーす
衝突の解決
 動かしやすい方を選択する
 兄弟の数が少ないノードを選択する
 兄弟の数が多いほど動かしにくいため
 動かしやすい方を退避する
 退避先として使える隙間を探す
2013/9/1 ダブル配列の豆知識 #DSIRNLP
13
使いまーす
Node … …
隙間探しの効率化
 未使用ノードの双方向連結リスト化
 BASE に次の未使用ノード
 CHECK に前の未使用ノード
2013/9/1 ダブル配列の豆知識 #DSIRNLP
14
0 1 2 3 4 5 6 7 …
BASE –3 –7 –1 …
CHECK –7 –1 1 –3 …
隙間探しの効率化
 隙間探しのポイント
 常に先頭から探索するのは危険
 理由:前の方に使いにくい隙間がたまる可能性
 対処 1:前回の探索位置から再開する
 対処 2:探索ノード数を制限する
 静的な構築では後半だけの探索で十分
 理由:衝突は完全に回避できる
 対処:探索範囲を後半 N ノードのみにする
2013/9/1 ダブル配列の豆知識 #DSIRNLP
15
兄弟探しの効率化
 連結リストベースのトライに歩み寄り
 先頭の子ノードのラベルを保持
 次の兄弟ノードのラベルを保持
 ノード番号はオフセットを使って求める
 利点 1:兄弟探しにおいて総当りしなくてよい
 利点 2:文字列補完も効率化できる(おまけ)
 欠点:サイズが大きくなる
2013/9/1 ダブル配列の豆知識 #DSIRNLP
16
ブロック単位の管理
 ブロックについて
 ブロック内にある未使用ノードの数
 隙間探しにおける探索条件として使う
 隙間探しに失敗した回数
 失敗しやすいブロックは探索しない
 未使用ノードの管理
 未使用ノードはブロック内で双方向連結リスト化
 ブロックはブロック同士で双方向連結リスト化
2013/9/1 ダブル配列の豆知識 #DSIRNLP
17
検索速度の向上
2013/9/1 ダブル配列の豆知識 #DSIRNLP
18
前半部分文字列の検索
 例
 入力: “ANDROID”
 出力: “A”, “AN”, “AND”, “ANDROID”
 終端ラベル
 終端ノードかどうか
 終端ラベルを持つ子ノードが存在するかどうか
 使い方
 経路上の各ノードが終端ノードかどうかを確認する
2013/9/1 ダブル配列の豆知識 #DSIRNLP
19
静的な構築
 動的に構築したダブル配列
 ノードがばらばらに配置された状態
 根付近以外ではキャッシュミスが起きにくい(共通)
 静的に構築したダブル配列
 ノードが深さ優先に配置された状態
 根付近以外ではキャッシュミスが起きにくい(共通)
 葉付近でもキャッシュミスが起きにくい
2013/9/1 ダブル配列の豆知識 #DSIRNLP
20
空間効率の向上
2013/9/1 ダブル配列の豆知識 #DSIRNLP
21
TAIL のマージ
 同じ文字列なら共有可能
 更新のあるタスクでは難しい
 同じ文字列を探すのに時間がかかる
 探すためのデータ構造を使うと余計に大きくなる
 後半部分列も共有可能
 たとえば, “DROID” は “ANDROID” の後半が使える
 おまけ
 キャッシュミスを減らせる
2013/9/1 ダブル配列の豆知識 #DSIRNLP
22
CHECK のラベル化
 親ノード番号の代わりにラベルを使う
 基本的にノード番号は 32-bit でラベルは 8-bit
 BASE を 24-bit にすれば Node を 32-bit にできる
 更新のあるタスクでは難しい
 衝突したときに親ノードがわからない
 動かしやすい方を選択するのは難しい
 BASE が重複するとおかしくなる
 親ノードが複数になってしまう
2013/9/1 ダブル配列の豆知識 #DSIRNLP
23
相対オフセットと拡張ビット
 24-bit BASE で大規模なダブル配列を実現
 BASE に拡張用のビットを加える
 拡張時はオフセットを 256 倍にする
 オフセットを相対値にする
 拡張時に粒度が粗くなる問題への対処
 拡張ビットによる分岐はなくせる
 (Node >> 10) << ((Node & (1U << 9)) >> 6)
 Darts-clone より抜粋(拡張ビットは 1U << 9)
2013/9/1 ダブル配列の豆知識 #DSIRNLP
24
グラフ化
 同じ部分木なら共有可能
 CHECK をラベル化して BASE を重複させる
 トライ(木構造)ではなく DAWG(グラフ)になる
 グラフを構築してからダブル配列を構築する
 静的な構築であれば,意外に時間がかからない
 Darts と Darts-clone の比較
 http://code.google.com/p/darts-clone/wiki/Evaluation
2013/9/1 ダブル配列の豆知識 #DSIRNLP
25
まとめ
2013/9/1 ダブル配列の豆知識 #DSIRNLP
26
まとめ
 ダブル配列について
 単純に実装するだけならそれなりの難易度
 ただし,バグが潜みやすい上にデバッグが困難
 実装前に考えるべきことは意外に多い
 TAIL の有無,静的・動的,更新時間の短縮方法など
 トライとは限らない
 CHECK をラベル化すればグラフも表現可能
2013/9/1 ダブル配列の豆知識 #DSIRNLP
27

More Related Content

What's hot

0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
MasanoriSuganuma
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
Shintaro Fukushima
 

What's hot (20)

PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
 
[DL輪読会]Attention Is All You Need
[DL輪読会]Attention Is All You Need[DL輪読会]Attention Is All You Need
[DL輪読会]Attention Is All You Need
 
論文紹介: Cuckoo filter: practically better than bloom
論文紹介: Cuckoo filter: practically better than bloom論文紹介: Cuckoo filter: practically better than bloom
論文紹介: Cuckoo filter: practically better than bloom
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
 
協調フィルタリング入門
協調フィルタリング入門協調フィルタリング入門
協調フィルタリング入門
 
アルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化するアルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化する
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
Json型の使い方
Json型の使い方Json型の使い方
Json型の使い方
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 

Viewers also liked

SMARTI
SMARTISMARTI
De felipe iii a carlos ii
De felipe iii a carlos iiDe felipe iii a carlos ii
De felipe iii a carlos ii
rousbell
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 

Viewers also liked (20)

grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015
 
TrieとLOUDS??
TrieとLOUDS??TrieとLOUDS??
TrieとLOUDS??
 
C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
Perl で自然言語処理
Perl で自然言語処理Perl で自然言語処理
Perl で自然言語処理
 
#ABC17 : Alphabet of Innovations, Academic Concepts and Emerging Movements
#ABC17 : Alphabet of Innovations, Academic Concepts and Emerging Movements#ABC17 : Alphabet of Innovations, Academic Concepts and Emerging Movements
#ABC17 : Alphabet of Innovations, Academic Concepts and Emerging Movements
 
SMARTI
SMARTISMARTI
SMARTI
 
De felipe iii a carlos ii
De felipe iii a carlos iiDe felipe iii a carlos ii
De felipe iii a carlos ii
 
Bienvenidos actualizando información sobre BETT & ISE 2017
Bienvenidos   actualizando información sobre BETT & ISE 2017Bienvenidos   actualizando información sobre BETT & ISE 2017
Bienvenidos actualizando información sobre BETT & ISE 2017
 
Popular Struggles & Movements
Popular Struggles & MovementsPopular Struggles & Movements
Popular Struggles & Movements
 
New Heavens & New Earth
New Heavens & New EarthNew Heavens & New Earth
New Heavens & New Earth
 
Offshore Maintenance Success: Adding $434M to the Bottom Line
Offshore Maintenance Success:  Adding $434M to the Bottom LineOffshore Maintenance Success:  Adding $434M to the Bottom Line
Offshore Maintenance Success: Adding $434M to the Bottom Line
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Insignias digitales. trabajo final.Lucy Fernández
Insignias digitales. trabajo final.Lucy FernándezInsignias digitales. trabajo final.Lucy Fernández
Insignias digitales. trabajo final.Lucy Fernández
 
Lipril (Lisinopril Dihydrate Tablets)
Lipril (Lisinopril Dihydrate Tablets)Lipril (Lisinopril Dihydrate Tablets)
Lipril (Lisinopril Dihydrate Tablets)
 
Finansijski izvjestaj o radu za 2016. godinu - Župa u srcu
Finansijski izvjestaj o radu za 2016. godinu - Župa u srcuFinansijski izvjestaj o radu za 2016. godinu - Župa u srcu
Finansijski izvjestaj o radu za 2016. godinu - Župa u srcu
 
Prepare se para sua startup de sucesso!
Prepare se para sua startup de sucesso!Prepare se para sua startup de sucesso!
Prepare se para sua startup de sucesso!
 
Event Report - Worforce Software Vision 2017 - Time to start the boosters
Event Report - Worforce Software Vision 2017 - Time to start the boostersEvent Report - Worforce Software Vision 2017 - Time to start the boosters
Event Report - Worforce Software Vision 2017 - Time to start the boosters
 
UI composition
UI compositionUI composition
UI composition
 

Recently uploaded

Recently uploaded (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

ダブル配列の豆知識