trianguler

71
Looking for Challenge 小倉拳 @catupper

Upload: ken-ogura

Post on 05-Dec-2014

195 views

Category:

Documents


0 download

DESCRIPTION

Search Kyuri

TRANSCRIPT

Page 1: Trianguler

Looking for Challenge小倉拳

@catupper

Page 2: Trianguler

Looking for Challengeグラフ理論

Page 3: Trianguler

問題

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を全て見つけよ

Page 4: Trianguler

問題

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を全て見つけよ

Page 5: Trianguler

問題

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を全て見つけよ● 一つ

Page 6: Trianguler

問題

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を全て見つけよ● 二つ

Page 7: Trianguler

問題

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を全て見つけよ● たくさん

Page 8: Trianguler

Looking for Challengeグラフ理論

列挙

Page 9: Trianguler

第一の疑問

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を列挙せよ

● 最大で何個くらいあるの?

Page 10: Trianguler

第一の補題

● 辺の数がMのグラフの中にある三角形の個数はたかだかM√(2M)個

Page 11: Trianguler

第一の補題

● 辺の数がMのグラフの中にある三角形の個数はたかだかM√(2M)個

● 証明しよう!● 証明は2通り

1.バリバリのグラフ理論

2.不等式をこねる

Page 12: Trianguler

第一の補題

● 辺の数がMのグラフの中にある三角形の個数はたかだかM√(2M)個

● 証明しよう!● 証明は2通り

1.バリバリのグラフ理論

2.不等式をこねる

Page 13: Trianguler

Looking for Challengeグラフ理論

列挙

Page 14: Trianguler

バリバリのグラフ理論

● 命題:辺の数がMのグラフのなかで最も次数が小さい頂点の次数は√(2M)を超えない– 頂点の次数というのはそれに繋がっている辺の数↓

 

 

 

 

 

Page 15: Trianguler

バリバリのグラフ理論

● 命題:辺の数がMのグラフのなかで最も次数が小さい頂点の次数は√(2M)を超えない– 頂点の次数というのはそれに繋がっている辺の数↓

– 次数の総和は2Mと一致する

 

 

 

 

Page 16: Trianguler

バリバリのグラフ理論

● 命題:辺の数がMのグラフのなかで最も次数が小さい頂点の次数は√(2M)を超えない– 頂点の次数というのはそれに繋がっている辺の数↓

– 次数の総和は2Mと一致する

● 背理法で証明– 全て次数が√(2M)以上と仮定

 

 

Page 17: Trianguler

バリバリのグラフ理論

● 命題:辺の数がMのグラフのなかで最も次数が小さい頂点の次数は√(2M)を超えない– 頂点の次数というのはそれに繋がっている辺の数↓

– 次数の総和は2Mと一致する

● 背理法で証明– 全て次数が√(2M)以上と仮定

– 頂点数は√(2M)を超える

 

Page 18: Trianguler

バリバリのグラフ理論

● 命題:辺の数がMのグラフのなかで最も次数が小さい頂点の次数は√(2M)を超えない– 頂点の次数というのはそれに繋がっている辺の数↓

– 次数の総和は2Mと一致する

● 背理法で証明– 全て次数が√(2M)以上と仮定

– 頂点数は√(2M)を超える

– 次数の総和が2Mを超える

Page 19: Trianguler

バリバリのグラフ理論

● グラフの中から最も次数が小さい頂点を選び、それを含む三角形を列挙し、その頂点を消すという操作を考える– 隣接する辺も同時に消す

  

                        

Page 20: Trianguler

バリバリのグラフ理論

● グラフの中から最も次数が小さい頂点を選び、それを含む三角形を列挙し、その頂点を消すという操作を考える– 隣接する辺も同時に消す

● これを全頂点がなくなるまで繰り返す– 全ての三角形を漏れなく、重複なく列挙することが

できる

Page 21: Trianguler

Looking for Challengeグラフ理論

列挙

Page 22: Trianguler

バリバリのグラフ理論

● 辺に注目する● ある辺eが消えるタイミングを考える

– その辺がつなぐ頂点のうちどちらかが消えるとき● vとする

                         

 

     

Page 23: Trianguler

バリバリのグラフ理論

● 辺に注目する● ある辺eが消えるタイミングを考える

– その辺がつなぐ頂点のうちどちらかが消えるとき● vとする

– そのとき数えられる三角形の中でeを含むものはいくつあるか?

 

 

     

Page 24: Trianguler

バリバリのグラフ理論

● 辺に注目する● ある辺eが消えるタイミングを考える

– その辺がつなぐ頂点のうちどちらかが消えるとき● vとする

– そのとき数えられる三角形の中でeを含むものはいくつあるか?

– eでない辺のうち少なくともひとつはvに隣接する

– よってたかだかeの次数しかない

     

Page 25: Trianguler

バリバリのグラフ理論

● 辺に注目する● ある辺eが消えるタイミングを考える

– その辺がつなぐ頂点のうちどちらかが消えるとき● vとする

– そのとき数えられる三角形の中でeを含むものはいくつあるか?

– eでない辺のうち少なくともひとつはvに隣接する

– よってたかだかeの次数しかない

– 命題1よりたかだか√(2M)               

Page 26: Trianguler

バリバリのグラフ理論

● 例● 赤い辺について考

える● 次数が4の頂点と共

に消えるとする

Page 27: Trianguler

バリバリのグラフ理論

● 例● 赤い辺について考

える● 次数が4の頂点と共

に消えるとする● この辺と頂点を含

む三角形はたかだか4つ

Page 28: Trianguler

バリバリのグラフ理論

● 辺は全部でM個なので数えられる三角形はたかだかM√(2M)個

● やったぜ

Page 29: Trianguler

バリバリのグラフ理論

● 辺は全部でM個なので数えられる三角形はたかだかM√(2M)個

● やったぜ

● 頭が痛くてなってつらい

Page 30: Trianguler

第一の補題

● 辺の数がMのグラフの中にある三角形の個数はたかだかM√(2M)個

● 証明しよう!● 証明は2通り

1.バリバリのグラフ理論

2.不等式をこねる

Page 31: Trianguler

不等式をこねる

● 次数がd[v]の頂点vを含む三角形はたかだかd[v]*d[v]/2個しかない– vに隣接する頂点から2つ選ぶ組み合わせ

Page 32: Trianguler

不等式をこねる

● 辺の数がM個のグラフの頂点vを含む三角形はたかだかM個しかない– 頂点vとそれを含まない辺が与えられるとそれらを

つかってたかだか1個しか辺が作れない

Page 33: Trianguler

不等式をこねる

● 辺がM個のグラフの次数がd[v]の頂点vを含む三角形の個数はmin(d[v]*d[v]/2, M)個を超えない

Page 34: Trianguler

不等式をこねる

● 辺がM個のグラフの次数がd[v]の頂点vを含む三角形の個数はmin(d[v]*d[v]/2, M)個を超えない

● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)

= d[v]√(M/2)

Page 35: Trianguler

不等式をこねる

● 辺がM個のグラフの次数がd[v]の頂点vを含む三角形の個数はmin(d[v]*d[v]/2, M)個を超えない

● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)

= d[v]√(M/2)● 全頂点での総和をとる

– 次数の総和は2Mなので

– Σd[v]√(M/2) = M√(2M)

Page 36: Trianguler

不等式をこねる

● 辺がM個のグラフの次数がd[v]の頂点vを含む三角形の個数はmin(d[v]*d[v]/2, M)個を超えない

● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)

= d[v]√(M/2)● 全頂点での総和をとる

– 次数の総和は2Mなので

– Σd[v]√(M/2) = M√(2M)

● やったぜ

Page 37: Trianguler

第一の疑問

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を列挙せよ

● 最大で何個くらいあるの?– M√(2M)個

Page 38: Trianguler

第二の疑問

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を列挙せよ

● どうやって列挙する?

Page 39: Trianguler

第二の疑問

● 頂点数がN、辺の数がMのグラフが与えられる● 互いに隣接している3頂点を列挙せよ

● どうやって列挙する?

Page 40: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ

 

 

 

 

 

Page 41: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す

 

 

 

 

Page 42: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す

– それを含む三角形を全部列挙

 

 

 

Page 43: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す

– それを含む三角形を全部列挙

– その頂点を消す

 

 

Page 44: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す

– それを含む三角形を全部列挙

– その頂点を消す

– 繰り返す

 

Page 45: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す

– それを含む三角形を全部列挙

– その頂点を消す

– 繰り返す

– やったぜ

Page 46: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す   ならしO(1)

– それを含む三角形を全部列挙 O(d[v]^2 logM)

– その頂点を消す       ならしO(1)

– 繰り返す

– やったぜ?

Page 47: Trianguler

実装の仕方

● 「バリバリのグラフ理論」の取り除くやつを実際に実装するだけ– 次数が最小の頂点を探す   ならしO(1)

– それを含む三角形を全部列挙 O(d[v]^2 logM)

– その頂点を消す       ならしO(1)

– 繰り返す

– 全部でO(M√MlogM)で残念ながら遅い

Page 48: Trianguler

どうすればよいのか?

Page 49: Trianguler

もっとバリバリのグラフ理論をする

Page 50: Trianguler

もっとバリバリのグラフ理論

● グラフの辺にループが出来ないように適当な向きを付ける– DAGを作れば良い

Page 51: Trianguler

もっとバリバリのグラフ理論

● グラフの辺にループが出来ないように適当な向きを付ける– DAGを作れば良い

● 三角形はすべてこの形になる

Page 52: Trianguler

もっとバリバリのグラフ理論

● グラフの辺にループが出来ないように適当な向きを付ける– DAGを作れば良い

● 三角形はすべてこの形になる● ある辺について始点と終点から

同じ頂点に辺が出ている時ちょうど1個三角形がある

Page 53: Trianguler

もっとバリバリのグラフ理論

● グラフの辺にループが出来ないように適当な向きを付ける– DAGを作れば良い

● 三角形はすべてこの形になる● ある辺について始点と終点から

同じ頂点に辺が出ている時ちょうど1個三角形がある

● 重複や漏れはない

Page 54: Trianguler

Looking for Challengeグラフ理論

列挙

Page 55: Trianguler

もっとバリバリのグラフ理論

● 全ての辺について、その始点からも終点からも点が出ている頂点を数え上げれば良い

 

                        

 

                      

Page 56: Trianguler

もっとバリバリのグラフ理論

● 全ての辺について、その始点からも終点からも点が出ている頂点を数え上げれば良い

● ここで計算量を考える● 各辺についてその終点と始点から共通して出て

いる頂点はflagを使って調べれば良い

 

                      

Page 57: Trianguler

もっとバリバリのグラフ理論

● 全ての辺について、その始点からも終点からも点が出ている頂点を数え上げれば良い

● ここで計算量を考える● 各辺についてその終点と始点から共通して出て

いる頂点はflagを使って調べれば良い● 計算量はmax(始点の出次数、終点の出次数)

                      

Page 58: Trianguler

もっとバリバリのグラフ理論

● 全ての辺について、その始点からも終点からも点が出ている頂点を数え上げれば良い

● ここで計算量を考える● 各辺についてその終点と始点から共通して出て

いる頂点はflagを使って調べれば良い● 計算量はmax(始点の出次数、終点の出次数)● 出次数をおさえることに成功したら計算量が削

減される

Page 59: Trianguler

もっとバリバリのグラフ理論

● どうやって出次数を削減しようか?

Page 60: Trianguler

Looking for Challengeグラフ理論

列挙

Page 61: Trianguler

ひらめきのLooking for Challenge

● 元の無向グラフの頂点たちの次数を求める● 各辺には次数が小さい方から大きい方に向きを

付ける

                       

 

Page 62: Trianguler

ひらめきのLooking for Challenge

● 元の無向グラフの頂点たちの次数を求める● 各辺には次数が小さい方から大きい方に向きを

付ける● これでDAGになるので先ほどの数え上げが使え

Page 63: Trianguler

ひらめきのLooking for Challenge

● 元の無向グラフの頂点たちの次数を求める● 各辺には次数が小さい方から大きい方に向きを

付ける● これでDAGになるので先ほどの数え上げが使え

る● 出次数はどうなるだろうか?

Page 64: Trianguler

ひらめきのLooking for Challenge

● 命題1の証明を思い出す– 次数が√(2M)より大きい頂点は√(2M)個より少ない

                           

                      

Page 65: Trianguler

ひらめきのLooking for Challenge

● 命題1の証明を思い出す– 次数が√(2M)より大きい頂点は√(2M)個より少ない

● 次数が√(2M)より小さい頂点はどんなふうに向きを付けても出次数は√(2M)を超えない

                          

 

Page 66: Trianguler

ひらめきのLooking for Challenge

● 命題1の証明を思い出す– 次数が√(2M)より大きい頂点は√(2M)個より少ない

● 次数が√(2M)より小さい頂点はどんなふうに向きを付けても出次数は√(2M)を超えない

● 次数が√(2M)より大きい頂点は自分より次数が多い頂点にしか辺は出て行かない– √(2M)個もないので出自数は√(2M)を超えない

Page 67: Trianguler

ひらめきのLooking for Challenge

● 次数が√(2M)より小さい頂点はどんなふうに向きを付けても出次数は√(2M)を超えない

● 次数が√(2M)より大きい頂点は自分より次数が多い頂点にしか辺は出て行かない– √(2M)個もないので出自数は√(2M)を超えない

Page 68: Trianguler

ひらめきのLooking for Challenge

● どの頂点も出次数が√(2M)を超えない!● さきほどの考察より全計算量はM√2M● これは三角形の個数の最大値と一致するのでお

およそ最適!● やったぜ

Page 69: Trianguler

Looking for Challenge小倉拳

@catupper

Page 70: Trianguler

今の発想を使う問題

● Algorithmic Engagements 2009 Round6– Cakes

● http://main.edu.pl/en/archive/pa/2009/cia● 面白いのでやってみてね!

Page 71: Trianguler

クリックしてタイトルの挿入!

ご清聴ありがとうございました