Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Path Copying による永続データ構造
Search
toyama
July 18, 2020
Science
0
490
Path Copying による永続データ構造
toyama
July 18, 2020
Tweet
Share
More Decks by toyama
See All by toyama
全文検索のアルゴリズムとデータ構造
toyama1710
0
230
Other Decks in Science
See All in Science
白金鉱業Meetup Vol.15 DMLによる条件付処置効果の推定_sotaroIZUMI_20240919
brainpadpr
2
600
Pericarditis Comic
camkdraws
0
1.5k
教師なしテンソル分解に基づく、有糸分裂後の転写再活性化におけるヒストン修飾ブックマークとしての転写因子候補の抽出法
tagtag
0
140
ABEMAの効果検証事例〜効果の異質性を考える〜
s1ok69oo
4
2.1k
創薬における機械学習技術について
kanojikajino
13
4.7k
Introduction to Image Processing: 2.Frequ
hachama
0
300
はじめてのバックドア基準:あるいは、重回帰分析の偏回帰係数を因果効果の推定値として解釈してよいのか問題
takehikoihayashi
2
950
All-in-One Bioinformatics Platform Realized with Snowflake ~ From In Silico Drug Discovery, Disease Variant Analysis, to Single-Cell RNA-seq
ktatsuya
PRO
0
260
科学で迫る勝敗の法則(名城大学公開講座.2024年10月) / The principle of victory discovered by science (Open lecture in Meijo Univ. 2024)
konakalab
0
230
[第62回 CV勉強会@関東] Long-CLIP: Unlocking the Long-Text Capability of CLIP / kantoCV 62th ECCV 2024
lychee1223
1
760
機械学習を支える連続最適化
nearme_tech
PRO
1
180
MoveItを使った産業用ロボット向け動作作成方法の紹介 / Introduction to creating motion for industrial robots using MoveIt
ry0_ka
0
200
Featured
See All Featured
The Invisible Side of Design
smashingmag
298
50k
Building Applications with DynamoDB
mza
91
6.1k
Rails Girls Zürich Keynote
gr2m
94
13k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
A better future with KSS
kneath
238
17k
How STYLIGHT went responsive
nonsquared
96
5.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
450
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
170
Optimising Largest Contentful Paint
csswizardry
33
3k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Transcript
Path Copying と永続データ構造 会津大学 学部1年 児島大和
自己紹介 • HN: 遠山 (twitter:@toyama_pts) • 絵を描いています • AtCoder: 青(highest)
永続データ構造ってなに? • 変更を加えても以前のデータが保存されている ◦ 破壊的変更を絶対に許さない • どのバージョンに対しても変更を行える • 今回は木構造の永続化について扱います
今回扱う木構造 • 親から子へリンクを持つ有向木
今回扱う木構造 • 親から子へリンクを持つ有向木 ◦ 二分探索木 7 5 8 2 6
1 3 9
今回扱う木構造 • 親から子へリンクを持つ有向木 ◦ セグメント木 (区間和を高速に取れる配列) a1+a2+a3+a4+a5+a6+a7+a8 a1+a2+a3+a4 a5+a6+a7+a8 a1+a2
a3+a4 a5+a6 a7+a8 a1 a2 a3 a4 a5 a6 a7 a8
永続化
ナイーブ解法 • 変更前の構造をまるっとコピー 7 5 8 2 6 9
ナイーブ解法 • 変更前の構造をまるっとコピー 7 5 8 2 6 9 7
5 8 2 6 9 全コピー
ナイーブ解法 • 変更前の構造をまるっとコピー 7 5 8 2 6 9 7
5 8 1 6 9 全コピー
ナイーブ解法 • 変更前の構造をまるっとコピー • 空間計算量さん!? 7 5 8 2 6
9 7 5 8 1 6 9 全コピー
ナイーブ解法 • 変更前の構造をまるっとコピー • 空間計算量さん!? • 時間計算量さん!!? 7 5 8
2 6 9 7 5 8 1 6 9 全コピー
ナイーブ解法 • 変更前の構造をまるっとコピー • 空間計算量さん!? • 時間計算量さん!!? ◦ 二分探索木は O(log
N) でデータ追加できた ◦ しかし O(N) に悪化してしまった!(ヤバい) 7 5 8 2 6 9 7 5 8 1 6 9 全コピー
スマート解法 (Path Copying) • 同じデータをたくさんコピーしていて無駄っぽい
スマート解法 (Path Copying) • コピーする必要のあるノードを考える 5 3 6 2 4
7 5 3 6 2 4 9
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 • コピーする必要のあるノードを考える
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 • コピーする必要のあるノードを考える • 旧6から新9へ辺をつなげば良さそう....?
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 • コピーする必要のあるノードを考える • 旧6から新9へ辺をつなげば良さそう....? 子を辿るときどちらへ行けば分からない
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 6 • コピーする必要のあるノードを考える
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 6 5 • コピーする必要のあるノードを考える
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 6 5 • コピーする必要のあるノードを考える
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 6 5 • コピーする必要のあるノードを考える • 変更ノードから根までをコピー • 根から一意に探索可能
スマート解法 (Path Copying) 5 3 6 2 4 7 5
3 6 2 4 7 9 6 5 • コピーする必要のあるノードを考える • 変更ノードから根までをコピー • 根から一意に探索可能 うれしい!!!!
子から親へ辺があると... 5 3 6 2 4 7 5 3 6
2 4 7 9 6 5
子から親へ辺があると... 5 3 6 2 4 7 5 3 6
2 4 7 9 6 5
子から親へ辺があると... 5 3 6 2 4 7 5 3 6
2 4 7 9 6 5 親を辿るときどちらへ行けば....?
子から親へ辺があると... 5 3 6 2 4 7 5 3 6
2 4 7 9 6 5 うれしくない.... • Path Copying で効率的な永続化は難しい
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
使用例 • 永続配列 0 1 2 3 4 5 6
7
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 0 0 0 0 0 0 ver.2
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 [2] += 2, [5] += 4
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 0 0 2 0 0 4 0 0 ver.3
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 [0] += 1, [2] += 1
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 1 0 3 0 0 4 0 0 ver.4
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 1 3 3 0 0 6 0 0 ver.4 [1] += 3, [5] += 2
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 1 3 3 0 0 6 0 0 ver.4 y=[1, 4] x=[1, 3]の和
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる 0 0 0 0 0
0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 1 3 3 0 0 6 0 0 ver.4 y=[1, 2], x=[1, 3]の和
永続データ構造使用例 • 矩形和を処理 ◦ 時間軸を縦軸と見立てる • 累積和で区間和を計算するのと同じ要領で矩形和を処理可能 0 0 0
0 0 0 0 0 ver.1 0 0 2 0 0 4 0 0 ver.2 1 0 3 0 0 4 0 0 ver.3 1 3 3 0 0 6 0 0 ver.4
まとめ -メリット • コピーが効率的(大抵 O(1)) ◦ 参照じゃないよ! ◦ 差分の小さい構造をたくさん作るとき有利 •
適用範囲が広い • 実現方法が美しい カッコいい 憧れる
まとめ -デメリット • やっぱりメモリは食う • デストラクタの実装が難 ◦ std::shared_ptr を使うと遅い... •
ならし計算量が壊れるかも • 競プロでさえ使うことは少ない
実装例 • 僕の github にあります (C++) ◦ https://toyama1710.github.io/cpp_library
ご清聴あり がとうござ いました!