Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
スライドの前に
この発表の後数え上げお姉さんの問題が登場
します。
こいつの言ってること全然よくわかんねぇな
~ってなったら諦めて数え上げお姉さんの動
画でも見て暇を潰そう。
組み合わせ集合
組み合わせ集合
組み合わせの集合です(完)
組み合わせ集合
組み合わせの集合です(完)
例:{H,T,D,N}の組み合わせ集合
{{H,D,N}, {T,D,N}}
{{φ(空集合)}, {T},{H,T,N}}
etc…
組み合わせ集合
組み合わせの集合です(完)
愚直に列挙は列挙数が増えると大変
場合分け二分木
場合分け二分木
場合分け二分木とは
場合分け二分木
場合分け二分木とは
葉以外のノードに要素、辺と葉に1/0を割り当
てた二分木
子への辺は有向辺とする
場合分け二分木
場合分け二分木とは
葉以外のノードに要素、辺と葉に1/0を割り当て
た二分木
子への辺は有向辺とする
組み合わせ集合を表すときに用いられるデータ構造。
ある組み合わせが木のパスと対応する。
場合分け二分木の例
{{H,D,N},{T,D,N}}
実線は要素を用いる
1の枝
破線は要素を用いない
0の枝
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
場合分け二分木の問題点
ノードが増えすぎる!!!
場合分け二分木の問題点
ノードが増えすぎる!!!
要素が1つ増えるだけでノード数が二倍以上に
要素数が多くなるとメモリが足りなくなる
どうしよう?
アイデア
部分木が等しければまとめられそう?
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
アイデア
部分木が等しければまとめられそう?
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
H
※もっとまとめられそう
(下のN-0-0とか)
zero-suppress
(ゼロサプレス)という考え方
ざっくり言うと0を省くという考え方
zero-suppress
(ゼロサプレス)という考え方
ざっくり言うと0を省くという考え方
例
電卓の00000334→334
これをさっきの場合分け二分木に適用しよう!
(??)
zero-suppress
(ゼロサプレス)という考え方
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
zero-suppress
(ゼロサプレス)という考え方
T
D
NN
0 0 0 0
D
NN
0 0 0 1
D
NN
0 0 0 1
H
good bye…
※他もまとめられます
ZDD
ZDDのルール
基本は場合分け二分木
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は
任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)
を共有する。
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)を共有
する。
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の子に直
結させる。
ZDDのルール
基本は場合分け二分木
それに加え以下の圧縮規則を適用(適用順は任意)
等価節点の共有
等価なノード(自身のラベルと子が等しい)を共有
する。
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の子に直
結させる...
ZDDの例
T
D
NN
0 0 0 0
D
NN
0 0 0 1
T
D
NN
0 0 0 1
D
NN
0 0 0 0
H
T
0
D
N
1
H
冗長節点の削除について
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の
子に直結させる。(謎規則)
背景にゼロサプレスという考え方がある
冗長節点の削除について
冗長節点の削除
1の枝が0を指しているノードを削除して0の枝の
子に直結させる。(謎規則)
背景にゼロサプレスという考え方がある
数千個のものから2つ、3つ選ぶとき、全部分
岐するのは冗長でしょみたいな
たまご・...
有効な場面
組み合わせ集合、中でも疎な集合に
有効(密な場合はBDDの方が良いこ
とも)
有効な場面
組み合わせ集合、中でも疎な集合に
有効(密な場合はBDDの方が良いこ
とも)
辺の集合からグラフの集合とかも表
せる(例:お姉さん問題)
有効な場面
組み合わせ集合、中でも疎な集合に有
効(密な場合はBDDの方が良いこと
も)
辺の集合からグラフの集合とかも表せ
る(例:お姉さん問題)
今回の後ろの発表はグラフがメインっぽ
い(本もグラフ列挙)
有効な場面
組み合わせ集合、中でも疎な集合に有効
(密な場合はBDDの方が良いことも)
辺の集合からグラフの集合とかも表せる
(例:お姉さん問題)
今回の後ろの発表はグラフがメインっぽい
(本もグラフ列挙)
※BDDはZDDの原型で圧縮ルー...
ZDDの作り方
全探索しても作れるが、ZDDの意味が薄くなる
ZDDの作り方
全探索しても作れるが、ZDDの意味が薄くなる
ボトムアップ的手法とトップダウン的手法がある
ボトムアップ的な手法は集合(ZDD)に対して
様々な演算(2つの集合をくっつけたり、集合の
ある要素をON,OFFしたりなど)を行...
フロンティア法
フロンティア
コロンビアではない
グラフの頂点の内、処理済みの辺と未処理の
辺両方に接続されている頂点の集合
A.フ ロ ン テ ィ ア
フロンティア法
ZDDをトップダウン的な手法で構築する手法。
こっちも結構難しい(小並感)
フロンティア法
ZDDをトップダウン的な手法で構築する手法。
こっちも結構難しい(小並感)
既約な形で出来るとは限らない
雰囲気はグラフを幅優先で枝刈り探索みたい
な
フロンティア法の背景
ZDDを上から作っていきたい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
しかし子が生まれてないので難しい
フロンティア法の背景
ZDDを上から作っていきたい
ZDDの全部の頂点を保持しておくのはヤバイ
作りながら枝刈りやノードの共有をしたい
しかし子が生まれてないので難しい
集合の状態を持つことで共有できるかどうか
判定しよう
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
グラフの全部の頂点を覚えるのはヤバそう
例:グラフのs-t経路の列挙
連結成分と次数だけを覚えておけばよい
しかしそれだけでもZDDの1頂点あたりO(頂
点数)だけ記憶領域が必要
グラフの全部の頂点を覚えるのはヤバそう
実はフロンティアの連結と次数だけ覚えてお
けばよい
例:グラフのs-t経路の列挙
S
S
T
T
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティアの状態だけ覚えてなんとかしよ
う!
フロンティア法まとめ
ZDD作ると記憶領域爆発しちゃうよぅ・・・
枝刈りとかして乗り切ろう!
状態持たせすぎて爆発しちゃうよぅ・・・
フロンティアの状態だけ覚えてなんとかしよ
う!
辺の処理順はうまくやろう(フロンティアが
爆発する可...
ふぇぇ・・・ZDD難しそうだよぅ・・・
C++のライブラリがあります(やったぜ)
https://github.com/junkawahara
Graphillionとかいう強そうなPythonのライブ
ラリもある
https://git...
まとめ
ZDDは組み合わせ集合を表すのに便利なデー
タ構造
場合分け二分木をゼロサプレスという考え方
などを用いて圧縮
ZDDの代表的な作り方はボトムアップ的手法
とフロンティア法がある
ライブラリで殴ろう(?)
おまけ1 BDD
BDDとZDD
ZDDは元々BDDの派生
ゼロサプレスではなくあってもなくてもどっ
ちでもいいような要素を省略する(適当)
おまけ2 競プロの問題を
解く
Alien Message
時間足りずにスライド書けなかったゾ~
入力のグリッドマップをグラフに変換します
グラフをライブラリに投げてハルミトン閉路
を検出します
終わり(やったぜ)
Upcoming SlideShare
Loading in …5
×

ZDD基礎

2,418 views

Published on

slide of JOI summer seminar

  • Be the first to comment

ZDD基礎

  1. 1. スライドの前に この発表の後数え上げお姉さんの問題が登場 します。 こいつの言ってること全然よくわかんねぇな ~ってなったら諦めて数え上げお姉さんの動 画でも見て暇を潰そう。
  2. 2. 組み合わせ集合
  3. 3. 組み合わせ集合 組み合わせの集合です(完)
  4. 4. 組み合わせ集合 組み合わせの集合です(完) 例:{H,T,D,N}の組み合わせ集合 {{H,D,N}, {T,D,N}} {{φ(空集合)}, {T},{H,T,N}} etc…
  5. 5. 組み合わせ集合 組み合わせの集合です(完) 愚直に列挙は列挙数が増えると大変
  6. 6. 場合分け二分木
  7. 7. 場合分け二分木 場合分け二分木とは
  8. 8. 場合分け二分木 場合分け二分木とは 葉以外のノードに要素、辺と葉に1/0を割り当 てた二分木 子への辺は有向辺とする
  9. 9. 場合分け二分木 場合分け二分木とは 葉以外のノードに要素、辺と葉に1/0を割り当て た二分木 子への辺は有向辺とする 組み合わせ集合を表すときに用いられるデータ構造。 ある組み合わせが木のパスと対応する。
  10. 10. 場合分け二分木の例 {{H,D,N},{T,D,N}} 実線は要素を用いる 1の枝 破線は要素を用いない 0の枝 T D NN 0 0 0 0 D NN 0 0 0 1 T D NN 0 0 0 1 D NN 0 0 0 0 H
  11. 11. 場合分け二分木の問題点 ノードが増えすぎる!!!
  12. 12. 場合分け二分木の問題点 ノードが増えすぎる!!! 要素が1つ増えるだけでノード数が二倍以上に 要素数が多くなるとメモリが足りなくなる どうしよう?
  13. 13. アイデア 部分木が等しければまとめられそう? T D NN 0 0 0 0 D NN 0 0 0 1 T D NN 0 0 0 1 D NN 0 0 0 0 H
  14. 14. アイデア 部分木が等しければまとめられそう? T D NN 0 0 0 0 D NN 0 0 0 1 T H ※もっとまとめられそう (下のN-0-0とか)
  15. 15. zero-suppress (ゼロサプレス)という考え方 ざっくり言うと0を省くという考え方
  16. 16. zero-suppress (ゼロサプレス)という考え方 ざっくり言うと0を省くという考え方 例 電卓の00000334→334 これをさっきの場合分け二分木に適用しよう! (??)
  17. 17. zero-suppress (ゼロサプレス)という考え方 T D NN 0 0 0 0 D NN 0 0 0 1 T D NN 0 0 0 1 D NN 0 0 0 0 H
  18. 18. zero-suppress (ゼロサプレス)という考え方 T D NN 0 0 0 0 D NN 0 0 0 1 D NN 0 0 0 1 H good bye… ※他もまとめられます
  19. 19. ZDD
  20. 20. ZDDのルール 基本は場合分け二分木
  21. 21. ZDDのルール 基本は場合分け二分木 それに加え以下の圧縮規則を適用(適用順は 任意) 等価節点の共有 等価なノード(自身のラベルと子が等しい) を共有する。
  22. 22. ZDDのルール 基本は場合分け二分木 それに加え以下の圧縮規則を適用(適用順は任意) 等価節点の共有 等価なノード(自身のラベルと子が等しい)を共有 する。 冗長節点の削除 1の枝が0を指しているノードを削除して0の枝の子に直 結させる。
  23. 23. ZDDのルール 基本は場合分け二分木 それに加え以下の圧縮規則を適用(適用順は任意) 等価節点の共有 等価なノード(自身のラベルと子が等しい)を共有 する。 冗長節点の削除 1の枝が0を指しているノードを削除して0の枝の子に直 結させる。 これ以上圧縮出来ない形のZDDを既約なZDDという
  24. 24. ZDDの例 T D NN 0 0 0 0 D NN 0 0 0 1 T D NN 0 0 0 1 D NN 0 0 0 0 H T 0 D N 1 H
  25. 25. 冗長節点の削除について 冗長節点の削除 1の枝が0を指しているノードを削除して0の枝の 子に直結させる。(謎規則) 背景にゼロサプレスという考え方がある
  26. 26. 冗長節点の削除について 冗長節点の削除 1の枝が0を指しているノードを削除して0の枝の 子に直結させる。(謎規則) 背景にゼロサプレスという考え方がある 数千個のものから2つ、3つ選ぶとき、全部分 岐するのは冗長でしょみたいな たまご・牛乳・パンケーキの集合ために何千 個の商品の0の枝を指すのはアホらしい
  27. 27. 有効な場面 組み合わせ集合、中でも疎な集合に 有効(密な場合はBDDの方が良いこ とも)
  28. 28. 有効な場面 組み合わせ集合、中でも疎な集合に 有効(密な場合はBDDの方が良いこ とも) 辺の集合からグラフの集合とかも表 せる(例:お姉さん問題)
  29. 29. 有効な場面 組み合わせ集合、中でも疎な集合に有 効(密な場合はBDDの方が良いこと も) 辺の集合からグラフの集合とかも表せ る(例:お姉さん問題) 今回の後ろの発表はグラフがメインっぽ い(本もグラフ列挙)
  30. 30. 有効な場面 組み合わせ集合、中でも疎な集合に有効 (密な場合はBDDの方が良いことも) 辺の集合からグラフの集合とかも表せる (例:お姉さん問題) 今回の後ろの発表はグラフがメインっぽい (本もグラフ列挙) ※BDDはZDDの原型で圧縮ルールが少し違う データ構造
  31. 31. ZDDの作り方 全探索しても作れるが、ZDDの意味が薄くなる
  32. 32. ZDDの作り方 全探索しても作れるが、ZDDの意味が薄くなる ボトムアップ的手法とトップダウン的手法がある ボトムアップ的な手法は集合(ZDD)に対して 様々な演算(2つの集合をくっつけたり、集合の ある要素をON,OFFしたりなど)を行って構築す る。(つらそう)
  33. 33. フロンティア法
  34. 34. フロンティア コロンビアではない グラフの頂点の内、処理済みの辺と未処理の 辺両方に接続されている頂点の集合 A.フ ロ ン テ ィ ア
  35. 35. フロンティア法 ZDDをトップダウン的な手法で構築する手法。 こっちも結構難しい(小並感)
  36. 36. フロンティア法 ZDDをトップダウン的な手法で構築する手法。 こっちも結構難しい(小並感) 既約な形で出来るとは限らない 雰囲気はグラフを幅優先で枝刈り探索みたい な
  37. 37. フロンティア法の背景 ZDDを上から作っていきたい
  38. 38. フロンティア法の背景 ZDDを上から作っていきたい ZDDの全部の頂点を保持しておくのはヤバイ
  39. 39. フロンティア法の背景 ZDDを上から作っていきたい ZDDの全部の頂点を保持しておくのはヤバイ 作りながら枝刈りやノードの共有をしたい
  40. 40. フロンティア法の背景 ZDDを上から作っていきたい ZDDの全部の頂点を保持しておくのはヤバイ 作りながら枝刈りやノードの共有をしたい しかし子が生まれてないので難しい
  41. 41. フロンティア法の背景 ZDDを上から作っていきたい ZDDの全部の頂点を保持しておくのはヤバイ 作りながら枝刈りやノードの共有をしたい しかし子が生まれてないので難しい 集合の状態を持つことで共有できるかどうか 判定しよう
  42. 42. 例:グラフのs-t経路の列挙 連結成分と次数だけを覚えておけばよい
  43. 43. 例:グラフのs-t経路の列挙 連結成分と次数だけを覚えておけばよい しかしそれだけでもZDDの1頂点あたりO(頂 点数)だけ記憶領域が必要
  44. 44. 例:グラフのs-t経路の列挙 連結成分と次数だけを覚えておけばよい しかしそれだけでもZDDの1頂点あたりO(頂 点数)だけ記憶領域が必要 グラフの全部の頂点を覚えるのはヤバそう
  45. 45. 例:グラフのs-t経路の列挙 連結成分と次数だけを覚えておけばよい しかしそれだけでもZDDの1頂点あたりO(頂 点数)だけ記憶領域が必要 グラフの全部の頂点を覚えるのはヤバそう 実はフロンティアの連結と次数だけ覚えてお けばよい
  46. 46. 例:グラフのs-t経路の列挙 S S T T
  47. 47. フロンティア法まとめ ZDD作ると記憶領域爆発しちゃうよぅ・・・
  48. 48. フロンティア法まとめ ZDD作ると記憶領域爆発しちゃうよぅ・・・ 枝刈りとかして乗り切ろう!
  49. 49. フロンティア法まとめ ZDD作ると記憶領域爆発しちゃうよぅ・・・ 枝刈りとかして乗り切ろう! 状態持たせすぎて爆発しちゃうよぅ・・・
  50. 50. フロンティア法まとめ ZDD作ると記憶領域爆発しちゃうよぅ・・・ 枝刈りとかして乗り切ろう! 状態持たせすぎて爆発しちゃうよぅ・・・ フロンティアの状態だけ覚えてなんとかしよ う!
  51. 51. フロンティア法まとめ ZDD作ると記憶領域爆発しちゃうよぅ・・・ 枝刈りとかして乗り切ろう! 状態持たせすぎて爆発しちゃうよぅ・・・ フロンティアの状態だけ覚えてなんとかしよ う! 辺の処理順はうまくやろう(フロンティアが 爆発する可能性アリ)
  52. 52. ふぇぇ・・・ZDD難しそうだよぅ・・・ C++のライブラリがあります(やったぜ) https://github.com/junkawahara Graphillionとかいう強そうなPythonのライブ ラリもある https://github.com/takemaru/graphillion/ wiki
  53. 53. まとめ ZDDは組み合わせ集合を表すのに便利なデー タ構造 場合分け二分木をゼロサプレスという考え方 などを用いて圧縮 ZDDの代表的な作り方はボトムアップ的手法 とフロンティア法がある ライブラリで殴ろう(?)
  54. 54. おまけ1 BDD
  55. 55. BDDとZDD ZDDは元々BDDの派生 ゼロサプレスではなくあってもなくてもどっ ちでもいいような要素を省略する(適当)
  56. 56. おまけ2 競プロの問題を 解く
  57. 57. Alien Message 時間足りずにスライド書けなかったゾ~ 入力のグリッドマップをグラフに変換します グラフをライブラリに投げてハルミトン閉路 を検出します 終わり(やったぜ)

×