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
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
科学で迫る勝敗の法則-スポーツデータ分析の最前線 (刈谷市連携講座.2026年7月) / The principle of victory discovered by science. at Kariya City, 2027.07
konakalab
0
170
YouTubeにおける撤回論文の参照実態 / metascience-meetup2026
corgies
3
360
プロジェクト「Azayaka」のSARの数式とジオメトリ
syuchimu
0
470
HOLO: Homography-Guided Pose Estimator Network for Fine-Grained Visual Localization on SD Maps
tomoaki0705
0
150
機械学習 - DBSCAN
trycycle
PRO
0
2.1k
不動産業界における業界特化のデータ整備とAI活用 ─Vertical DataとVertical AI─
estie
1
970
データベース02: データベースの概念
trycycle
PRO
2
1.4k
Massey Ratings for Match Outcome Prediction in Table Tennis: Evidence of Greater Stability than the ITTF World Ranking
konakalab
0
150
GKE上でオセロの強化学習やってみた
akasan
0
110
From Prediction to Understanding: Causal Discovery for Data Science and AI Applications
sshimizu2006
0
300
AI bij literatuuronderzoek in de wetenschap
voginip
0
260
O(log n)-Approximation Algorithms for Bipartiteness Ratio
tasusu
0
190
Featured
See All Featured
Designing for Performance
lara
611
70k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Balancing Empowerment & Direction
lara
6
1.3k
Site-Speed That Sticks
csswizardry
13
1.5k
Bash Introduction
62gerente
615
220k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
The SEO Collaboration Effect
kristinabergwall1
1
570
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
What's in a price? How to price your products and services
michaelherold
247
13k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
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
ご清聴あり がとうござ いました!