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
510
Path Copying による永続データ構造
toyama
July 18, 2020
Tweet
Share
More Decks by toyama
See All by toyama
全文検索のアルゴリズムとデータ構造
toyama1710
0
240
Other Decks in Science
See All in Science
FOGBoston2024
lcolladotor
0
140
Snowflakeによる統合バイオインフォマティクス
ktatsuya
PRO
0
560
Mechanistic Interpretability の紹介
sohtakahashi
0
490
学術講演会中央大学学員会八王子支部
tagtag
0
260
構造設計のための3D生成AI-最新の取り組みと今後の展開-
kojinishiguchi
0
710
機械学習による確率推定とカリブレーション/probabilistic-calibration-on-classification-model
ktgrstsh
2
330
Cross-Media Information Spaces and Architectures (CISA)
signer
PRO
3
30k
白金鉱業Meetup Vol.15 DMLによる条件付処置効果の推定_sotaroIZUMI_20240919
brainpadpr
2
650
【健康&筋肉と生産性向上の関連性】 【Google Cloudを企業で運用する際の知識】 をお届け
yasumuusan
0
420
事業会社における 機械学習・推薦システム技術の活用事例と必要な能力 / ml-recsys-in-layerx-wantedly-2024
yuya4
3
280
ガウス過程回帰とベイズ最適化
nearme_tech
PRO
1
110
トラブルがあったコンペに学ぶデータ分析
tereka114
2
1.3k
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
For a Future-Friendly Web
brad_frost
176
9.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
580
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Making Projects Easy
brettharned
116
6k
Scaling GitHub
holman
459
140k
Why Our Code Smells
bkeepers
PRO
335
57k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
A Tale of Four Properties
chriscoyier
157
23k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
250
Typedesign – Prime Four
hannesfritz
40
2.5k
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
ご清聴あり がとうござ いました!