Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Path Copying による永続データ構造
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
toyama
July 18, 2020
Science
720
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Path Copying による永続データ構造
toyama
July 18, 2020
More Decks by toyama
See All by toyama
全文検索のアルゴリズムとデータ構造
toyama1710
0
330
Other Decks in Science
See All in Science
HOLO: Homography-Guided Pose Estimator Network for Fine-Grained Visual Localization on SD Maps
tomoaki0705
0
150
Massey Ratings for Match Outcome Prediction in Table Tennis: Evidence of Greater Stability than the ITTF World Ranking
konakalab
0
150
Tensor Factorization Meets Deformed Information Geometry: Convex Relaxation under Deformed Algebra
gkazunii
0
150
白金鉱業Meetup Vol.25 【初学者向け発表枠】「で、この施策って効いてるの」に答える効果検証の基礎 ~ATE / ATT / CATE / LATEを現場の問いに翻訳する~
brainpadpr
0
220
[NLP2026 参加報告会] AI for Science まとめ / NLP2026
lychee1223
0
2k
Understanding CVP Waveforms: Interpretation and Clinical Implications in Anesthesiology
taka88
0
890
科学で迫る勝敗の法則-スポーツデータ分析の最前線 (刈谷市連携講座.2026年7月) / The principle of victory discovered by science. at Kariya City, 2027.07
konakalab
0
170
データベース08: 実体関連モデルとは?
trycycle
PRO
0
1.6k
CVPR2026_VGGTとその仲間たち
mickey_0226
0
1.1k
チュートリアル:世界モデル
hf149
0
2.3k
コーヒー豆様核 (Coffee-bean nuclei) における形態学的サブタイピングと精選・焙煎特性の同定
jagupath
PRO
0
180
Inside the Mind of an LLM
baggiponte
0
340
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
580
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
How to Talk to Developers About Accessibility
jct
2
550
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Abbi's Birthday
coloredviolet
4
10k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Odyssey Design
rkendrick25
PRO
2
810
SEO for Brand Visibility & Recognition
aleyda
0
4.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
ご清聴あり がとうござ いました!