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
700
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
320
Other Decks in Science
See All in Science
俺たちは本当に分かり合えるのか? ~ PdMとスクラムチームの “ずれ” を科学する
bonotake
2
2.4k
データベース08: 実体関連モデルとは?
trycycle
PRO
0
1.1k
AIを用いた PID制御で部屋 の温度制御をしてみた
nearme_tech
PRO
0
130
(メタ)科学コミュニケーターからみたAI for Scienceの同床異夢
rmaruy
0
240
東北地方における過去20年間の降水量の変化
naokimuroki
1
240
(2025) Balade en cyclotomie
mansuy
0
620
データベース01: データベースを使わない世界
trycycle
PRO
1
1.3k
Question Driven Development using Python
willingc
PRO
1
120
AkarengaLT vol.41
hashimoto_kei
1
140
Testing the Longevity Bottleneck Hypothesis
chinson03
0
310
CVPR2026_VGGTとその仲間たち
mickey_0226
0
770
KISHIMOTO Atsuo
genomethica
0
140
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
550
HDC tutorial
michielstock
2
690
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
600
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
How STYLIGHT went responsive
nonsquared
100
6.2k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
The Language of Interfaces
destraynor
162
27k
The Invisible Side of Design
smashingmag
302
52k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
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
ご清聴あり がとうござ いました!