Document

ACM/ICPC
と
アルゴリズム
speech @ 「実践的プログラミング」
稲葉 一浩
自己紹介
‫ ﻪ‬理Ⅰ → 理学部情報科学科 →
情報理工学系研究科コンピュータ科学専攻
‫ ﻩ‬博士課程1年
‫ ﻩ‬XMLを扱う専用言語の研究など
‫ ﻪ‬個人的には
‫ ﻩ‬http://www.kmonos.net/
‫ ﻯ‬D言語
‫ ﻯ‬C++. Boost
‫ ﻪ‬ACM/ICPC歴
‫ ﻩ‬2003 [Lighthouse] ビバリーヒルズ大会 (11位)
‫ ﻩ‬2004 [Gokuri] ソウル予選、会津予選で敗退
‫ ﻩ‬2005 [Gokuri-Squeeze] 上海大会(惨敗orz)
「アルゴリズム」とは
‫ ﻪ‬アルゴリズム (algorithm) は、なんらかの
問題を解くための手順のことである。算法
(さんぽう)と訳されることもある。
-- Wikipediaより
‫ ﻪ‬例
‫ ﻩ‬なんらかの問題 : 整列(sorting)
‫ ﻩ‬アルゴリズム : クイックソート、バケツソート,...
発表の内容
‫ ﻪ‬どういう問題を解くアルゴリズムを
知っているとよいのか!?
‫ ﻪ‬どういう問題を解くアルゴリズムは
知らなくてもいいのか!?
「NP完全問題」
‫ ﻪ‬NP問題
‫「 ﻩ‬答えがあってるかのチェック」は簡単な問題
‫ ﻯ‬Sorting とか
‫ ﻪ‬NP困難問題
‫ ﻩ‬どんなNP問題よりも、それ以上に「難しい」問題
‫「 ﻯ‬この問題が効率よく解ければ他のどんなNP問題も解ける」
とわかっている問題
‫ ﻪ‬NP完全問題 : NPかつNP困難
‫ ﻩ‬NP問題の中で一番「難しい」問題
「NP完全問題」
‫ ﻪ‬ICPCなどでも、よく出題される
‫ ﻪ‬でも、NP完全問題を効率よく解く
アルゴリズムは、まだ誰も発見していない
‫ ﻩ‬もちろんICPCの出題者も!
‫ ﻪ‬うまい解き方が思いつかなくても問題なし
‫「 ﻩ‬NP完全問題だ」と気づいたら、
なんの工夫もないプログラムで突撃してOK!
‫ ﻩ‬そういう風に入力が作ってあるはず
「NP完全問題」の例
‫ﻪ‬
‫ﻪ‬
‫ﻪ‬
‫ﻪ‬
‫ﻪ‬
巡回セールスマン問題
ハミルトン経路問題
集合分割問題
最大クリーク問題
ナップザック問題
Traveling Salesperson Problem
‫ ﻪ‬入力:都市間の移動にかかる時間
‫ ﻪ‬出力:全ての都市を巡って戻ってくる最短経路
Hamiltonian Path
‫ ﻪ‬入力:点と辺でできた図形(グラフ)
‫ ﻪ‬出力:全点を一度ずつ通るような経路
「ひとふでがき」
とはちょっと違う
Partition
‫ ﻪ‬入力:数の集合
‫ ﻪ‬出力:和が丁度半分になるように分けられる?
{1.2, 3.4, 5.6,
5.3, 0.9, 3.5}
ただし、
数の集合が「小さい整数」と
わかっているときは、
効率よく解ける。(DP)
Maximum Clique
‫ ﻪ‬入力:グラフ
‫ ﻪ‬出力:どの2点も辺でつながってるような
頂点集合の最大サイズ
Knapsack Problem
‫ ﻪ‬入力:荷物(重さ、価値)
‫ ﻪ‬出力:重量制限を満たす
範囲でできるだけ
価値を増やす荷物の
選び方
そのほか
‫ ﻪ‬Google “NP完全”
‫ ﻪ‬Wikipedia “NP完全”
実際に出た問題
‫ﻪ‬
‫ﻪ‬
‫ﻪ‬
‫ﻪ‬
2005 F (巡回セールスマン問題)
2003 E (最適配置問題)
2002 D (Hit & Blow)
...
おまけ
‫ ﻪ‬知っているとよいアルゴリズム
‫ ﻩ‬グラフ理論
‫ﻯ‬
『データ構造とアルゴリズム』 培風館
エイホ、ウルマン、ホップクロフト
‫ﻯ‬
『アルゴリズムC++』
セジウィック
‫ ﻩ‬図形問題
‫ ﻯ‬高校の数学の教科書
近代科学社