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
divide-and-conquer
Search
autumn_eel
October 11, 2020
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
divide-and-conquer
autumn_eel
October 11, 2020
More Decks by autumn_eel
See All by autumn_eel
quantum-algorithm
autumn_eel
0
61
facility-location-problem.pdf
autumn_eel
0
49
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.4k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
710
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Git: the NoSQL Database
bkeepers
PRO
433
67k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Skip the Path - Find Your Career Trail
mkilby
1
260
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Leo the Paperboy
mayatellez
10
2.4k
Transcript
分割統治とデータ構造 PYK合同LT大会 autumn_eel
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
分割統治とは?
分割統治とは?
分割統治とは?
分割統治とは? • 「分けて解いてまとめる」手法 • 1つの大きな問題を複数の小さな問題に分割し、それを利用す ることで大きな問題を解く
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 長さ4の列をソートせよという小さな問題に変換
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 長さ4の列をソートせよという小さな問題に変換
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 さらに繰り返して…
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 さらに繰り返して…
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 「長さ1の列をソートする」という問題はすでに解けている!
列の分割統治 • マージソートのアルゴリズム 4 2 6 7 5 1 8
3 「長さ1の列をソートする」という問題はすでに解けている!
列の分割統治 • マージソートのアルゴリズム 2 4 6 7 1 5 3
8 今度は解いた小さな問題を大きな問題にまとめていく
列の分割統治 • マージソートのアルゴリズム 2 4 6 7 1 5 3
8 今度は解いた小さな問題を大きな問題にまとめていく
列の分割統治 • マージソートのアルゴリズム 2 4 6 7 1 3 5
8 さらに繰り返して…
列の分割統治 • マージソートのアルゴリズム 2 4 6 7 1 3 5
8 さらに繰り返して…
列の分割統治 • マージソートのアルゴリズム 1 2 3 4 5 6 7
8 ソート完了!
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
「列の分割統治」とデータ構造 • ここで、先ほどのマージソートで出てきた、列をまとめていく 過程をもう一度見てみる 4 2 6 7 5 1
8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8
「列の分割統治」とデータ構造 • ここで、先ほどのマージソートで出てきた、列をまとめていく 過程をもう一度見てみる 4 2 6 7 5 1
8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8 …あれ?
「列の分割統治」とデータ構造 • ここで、先ほどのマージソートで出てきた、列をまとめていく 過程をもう一度見てみる 4 2 6 7 5 1
8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8
「列の分割統治」とデータ構造 • ここで、先ほどのマージソートで出てきた、列をまとめていく 過程をもう一度見てみる 4 2 6 7 5 1
8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8 セグ木みたい!!!
「列の分割統治」とデータ構造 • 実は、マージソートによって現れたこの「セグ木みたいな木」 を実際に構築すると、 もとの列で区間[l,r)に含まれるk以下の数の個数を数えるクエリ に答えることができる
「列の分割統治」とデータ構造 • 実は、マージソートによって現れたこの「セグ木みたいな木」 を実際に構築すると、 もとの列で区間[l,r)に含まれるk以下の数の個数を数えるクエリ に答えることができる • 蟻本にも載ってる、領域木というやつ (海外では Merge
Sort Tree とも呼ばれているらしい)
「列の分割統治」とデータ構造 • 例: 区間 [1, 8) (0-indexed) に含まれる6以下の数の個数 4 2
6 7 5 1 8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8
「列の分割統治」とデータ構造 • 例: 区間 [1, 8) (0-indexed) に含まれる6以下の数の個数 4 2
6 7 5 1 8 3 2 4 6 7 1 5 3 8 2 4 6 7 1 3 5 8 1 2 3 4 5 6 7 8 それぞれの区間において 「6以下の個数」を二分探索で求め、 それらを足せばOK
ここまでのまとめ
ここまでのまとめ 分割統治をする過程で現れた木構造をデータ構造として保持する と、なんかいろいろなことができそう!!
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 3
2 1 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 3
2 1 10 分割した後の木のサイズがもとの半分以下になるような 頂点 (重心) を選ぶ
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 2
1 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 2
1 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 5 4 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 5 4 10 1ステップで半分以下になるので再帰の深さは
O(logN)
木の分割統治 • 距離が4以下のペアの数を求めたい 9 7 5 4 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 7 5 4 10 この問題はもう解けて いるので…
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 5 4 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 2
1 10 マークされた頂点を通るパスで、 距離が4以下のものを数えながら 足していく
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 3
2 1 10
木の分割統治 • 距離が4以下のペアの数を求めたい 9 8 7 6 5 4 3
2 1 10 もとの問題を解くことができた
目次 • 分割統治とは? • 列の分割統治 • 「列の分割統治」とデータ構造 • 木の分割統治 •
「木の分割統治」とデータ構造
「木の分割統治」とデータ構造 • ここでまた、分割した後まとめていく過程を眺めてみる
「木の分割統治」とデータ構造 • ここでまた、分割した後まとめていく過程を眺めてみる
「木の分割統治」とデータ構造 • ここでまた、分割した後まとめていく過程を眺めてみる 高さがO(logN) の根付き木!!
「木の分割統治」とデータ構造 • このデータ構造(根付き木)を使うと例えばこんな問題が解ける
「木の分割統治」とデータ構造 • このデータ構造(根付き木)を使うと例えばこんな問題が解ける
「木の分割統治」とデータ構造 • 問題概要 (意訳) • 2つのクエリを処理します • 指定された頂点を白or黒に変更 • 指定された頂点から黒い頂点への距離の総和を求め、出力
「木の分割統治」とデータ構造 • 問題概要 (意訳) • 2つのクエリを処理します • 指定された頂点を白or黒に変更 • 指定された頂点から黒い頂点への距離の総和を求め、出力
• 想定解はHL分解を使うものだったが…
「木の分割統治」とデータ構造 • それぞれの根付き木の頂点では 1. 「そこの集合に含まれる黒い頂点の個数」 2. 「マークされた頂点から集合に含まれる黒い頂点への距離の総和」 を子の種類ごとにまとめ、その総和も保持 (頂点集合は実際には持たなくてよい)
「木の分割統治」とデータ構造 • 頂点4を黒にする (個数, 総和)
「木の分割統治」とデータ構造 • 頂点4を黒にする (個数, 総和) (1,2) (1,0) (1,1) (1,2) (1,2)
(1,2)
「木の分割統治」とデータ構造 • 頂点6を黒にする (個数, 総和) (1,2) (1,0) (1,1) (1,2) (1,2)
(1,2)
「木の分割統治」とデータ構造 • 頂点6を黒にする (個数, 総和) (1,2) (1,0) (1,1) (1,2) (2,3)
(1,2) (1,0) (1,1)
「木の分割統治」とデータ構造 • 頂点10からの距離の総和を求める (個数, 総和) (1,2) (1,0) (1,1) (1,2) (2,3)
(1,2) (1,0) (1,1)
「木の分割統治」とデータ構造 • 頂点10からの距離の総和を求める (個数, 総和) (1,2) (1,0) (1,1) (1,2) (2,3)
(1,2) (1,0) (1,1) 1*1+2=3 3*1+2=5 3*2+3=9
「木の分割統治」とデータ構造 • 頂点10からの距離の総和を求める (個数, 総和) (1,2) (1,0) (1,1) (1,2) (2,3)
(1,2) (1,0) (1,1) 1*1+2=3 3*1+2=5 3*2+3=9 9-5+3=7 (ダブりを引かなければ ならないことに注意)
「木の分割統治」とデータ構造 ある(もとの)頂点を含む集合は高々O(logN)個なので、 それぞれのクエリはO(logN)回の更新/計算で処理できる!
「木の分割統治」とデータ構造 類題 • PCK2020予選 12 (http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0439) 距離の総和ではなく最短距離だが、同じような感じでできる • yukicoder TreeAddQuery
(https://yukicoder.me/problems/no/1038) それぞれの頂点上でBITを保持する 実装が少し大変
まとめ
まとめ どうして分割統治の過程をデータ構造にするとうまくいくのか?
まとめ どうして分割統治の過程をデータ構造にするとうまくいくのか? おそらく、「分割統治」と「データ構造」が再帰的な構造という 意味で似ているから!
まとめ どうして分割統治の過程をデータ構造にするとうまくいくのか? おそらく、「分割統治」と「データ構造」が再帰的な構造という 意味で似ているから! 一見別々な手法が根本的な考え方でつながっていることがわかる と楽しい
ご清聴ありがとうございました