Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
問題解決力を鍛える!
アルゴリズムとデータ構造
出版記念講演会
大槻 兼資
(ペンネーム: けんちょん)
2020/10/29
@数理システムセミナールーム
1
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年~:NTT データ数理システム
• 専門は数理工学全般
• アルゴリズム
• 探索, ネットワーク, etc…
• 数理最適化
•...
3
自己紹介 (趣味編)
(10月29日) (7 の形) (1234567890 で「コ」)
• 虫食算作り
• コミケなどにも出店
• オーム社雑誌「ロボコンマガジン」の懸賞担当
/ 99
• 虫食算作り
• コミケなどにも出店
• オーム社雑誌「ロボコンマガジン」の懸賞担当
自己紹介 (趣味編)
(全部虫食い) (たのしい) (将棋: 美濃囲い)
5
アルゴリズムとは
• ある問題を解くための方法、手順のこと
• それを実装したものがプログラム
「うまくやるための手順書」
というイメージ
https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
6
アルゴリズムの身近な例
• 料理のレシピ
• ゲームの攻略法
• 英単語の辞書での調べ方
• 3 の倍数の判定方法
/ 99
7
なぜアルゴリズムなのか
• AI や量子コンピュータなどの、分野の流行に依らない
一生モノのスキル
• むしろ AI を学ぶための強力な下地となる
• さまざまな分野で、問題解決に寄与する
• インフラ, サービス, 金融, 物流, 製造,...
8
アルゴリズム本に込めた想い
• アルゴリズムは、実際の問題解決に活かしてナンボ
• 「~法」の知識の紹介だけでは終わらない
• 「具体的な問題の解き方」を詳しく解説
• アルゴリズムは楽しい
9
アルゴリズム本に込めた想い
設計技法
・本の最初に設計技法を特集
・本の全体で設計技法を使用
10
本日の講演内容
• アルゴリズムの設計技法の紹介
• アルゴリズムの速度性能向上に関する話
• まとめ
/ 99
11
様々なアルゴリズム技法
• 探索
• 二分探索 (例: 年齢当てゲーム)
• 深さ優先探索 (例: 数独ソルバー)
• 幅優先探索 (例: 迷路の最短路)
• 動的計画法 (例: 編集距離)
• グラフ
/ 99
12
様々なアルゴリズム技法
• 探索
• 二分探索 (例: 年齢当てゲーム)
• 深さ優先探索 (例: 数独ソルバー)
• 幅優先探索 (例: 迷路の最短路)
• 動的計画法 (例: 編集距離)
• グラフ
今日
/ 99
13
様々なアルゴリズム技法
• 探索
• 二分探索 (例: 年齢当てゲーム)
• 深さ優先探索 (例: 数独ソルバー)
• 幅優先探索 (例: 迷路の最短路)
• 動的計画法 (例: 編集距離)
• グラフ
今日
数理システムでも
動的計画法...
14
グラフ
• 物事の関係性を「丸」と「線」を用いて表したもの
• コンピュータサイエンスのあらゆる領域で使われる
/ 99
15
グラフ
• ありとあらゆるモノをグラフで表せる!
• さまざまな分野の問題をグラフに関する問題として
見通よく統一的に扱える!
16
深さ優先探索
• 数独ソルバーを作ることを考える
https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
/ 99
17
深さ優先探索
• 数独を解く過程もグラフで表せる!
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
1...
18
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
/ 99
19
深さ優先探索の動き
2
32
2
1
1
1
2
32
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
/ 99
20
深さ優先探索の動き
2
32
2
1
1
1
2
32
2
1
1
1 1
2
32
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
/ 99
21
深さ優先探索の動き
2
32
2
1
1
1
2
32
2
1
1
1 1
2
32
2
1
1
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
/ 99
22
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 1 2
2
32
2
1
1
/ 99
23
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 1 2
2
32
2
1
1
/ 99
24
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
/ 99
25
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
1 2
1
2
32
2
1...
26
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
1 2
1
2
32
2
1...
27
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
12
32
2
1
1
1 ...
28
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
12
32
2
1
1
1 ...
29
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
12
32
2
1
1
1 ...
30
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
12
32
2
1
1
1 ...
31
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
1...
32
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
2
32
2
1
1
1...
33
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
34
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
35
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
36
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
37
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
38
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
39
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
40
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
32
2
1
1
1 2
32
2
1
1
2
32
2
1
1
32
2
32
2
1
1
12
32
2
1
1
1 2
32
2
1
1
11 2 3
...
41
深さ優先探索の応用
• 数独ソルバー
• https://github.com/drken1215/sudoku
• 虫食算ソルバーも同様に作れる
• コンピュータ将棋 AI の探索ルーチン
• makefile などのビルドシステム
• ...
深さ優先探索のポイント
• 「目の付け所」がとても大事!
• 探索順序を工夫したり…探索不要なところを見出したり
• 数独なら、選択肢が少なそうなマスから順に考えるなど
スケジューリング案件などでも
• どの従業員をどのシフトに割り当てるか? → 探索
• 自由度の小さいところから先に割り当てるなど
• Nuopt の node selection
• 他に「とりあえず割り当ててみてひたすら改良」という
アプロ...
Yes / No チャート
• FAQ やトラブルシューティング
• 刑法適用ロジックなども
https://www.digitalbook-meclib.jp/tips/detail/yesno-chart/
Yes / No の視点の順序
...
Decision Diagram で広がる応用
• 様々なネットワークの解析や最適設計
• 電力解析網
• 鉄道経路探索
• 割当問題
• 選挙区割当
• 住民のフロアプランの列挙
• テキストマイニングへの応用も
• 頻出ワードマイニング
•...
46
様々なアルゴリズム技法 (再掲)
• 探索
• 二分探索 (例: 年齢当てゲーム)
• 深さ優先探索 (例: 数独ソルバー)
• 幅優先探索 (例: 迷路の最短路)
• 動的計画法 (例: 編集距離)
• グラフ
/ 99
47
幅優先探索
• 迷路の最短路を求めよう!
• スタート (S) からゴール (G) への最短経路は?
/ 99
48
幅優先探索
• 迷路の最短路を求めよう!
• スタート (S) からゴール (G) への最短経路は?
これもグラフ!
/ 99
49
幅優先探索
• まず S から 1 手で行けるマスに「1」と書く
/ 99
50
幅優先探索
• 次に「1」から 1 手で行けるマスに「2」と書く
/ 99
51
幅優先探索
• 「2」から 1 手で行けるマスに「3」と書く
/ 99
52
幅優先探索
• 「3」から 1 手で行けるマスに「4」と書く
/ 99
53
幅優先探索
• 「4」から 1 手で行けるマスに「5」と書く
/ 99
54
幅優先探索
• 「5」から 1 手で行けるマスに「6」と書く
/ 99
55
幅優先探索
• 「6」から 1 手で行けるマスに「7」と書く
/ 99
56
幅優先探索
• 「7」から 1 手で行けるマスに「8」と書く
/ 99
57
幅優先探索
• 「8」から 1 手で行けるマスに「9」と書く
/ 99
58
幅優先探索
• 「9」から 1 手で行けるマスに「10」と書く
/ 99
59
幅優先探索
• 「10」から 1 手で行けるマスに「11」と書く
/ 99
60
幅優先探索
• 「11」から 1 手で行けるマスに「12」と書く
/ 99
61
幅優先探索
• 「12」から 1 手で行けるマスに「13」と書く
/ 99
62
幅優先探索
• 「13」から 1 手で行けるマスに「14」と書く
/ 99
63
幅優先探索
• 「14」から 1 手で行けるマスに「15」と書く
/ 99
64
幅優先探索
• 「15」から 1 手で行けるマスに「16」と書く
• これでゴール!!!
/ 99
65
幅優先探索
• ゴールから、「数値が 1 ずつ下がっていくように」
遡っていくと、最短経路が得られる
/ 99
66
幅優先探索の応用
• カーナビ
• 電車の乗り換え案内
• パズル (15-パズルなど) の最小手数
https://www.amazon.co.jp/dp/B071J2XFS6
67
最短経路問題 - 実応用に向けて
• 道路の長さも考慮
• ダイクストラ法などより高度なアルゴリズムへ
• 道路の交通状況も考慮
• 「ここを通ると嬉しい」というボーナスも
• ベルマンフォード法などより高度なアルゴリズムへ
• 街の構造...
68
様々なアルゴリズム技法 (再掲)
• 探索
• 二分探索 (例: 年齢当てゲーム)
• 深さ優先探索 (例: 数独ソルバー)
• 幅優先探索 (例: 迷路の最短路)
• 動的計画法 (例: 編集距離)
• グラフ
/ 99
69
二分探索
A さんの年齢を当てたいとします
A さんが 20 歳以上 28 歳未満であることはわかっている
Yes / No で答えられる質問を 3 回まで行える
A さんの年齢を当てることは可能か?
私は何歳でしょう?
20, 21, ...
70
効率悪い方法 (線形探索)
私は何歳でしょう?
20, 21, 22, 23, 24, 25, 26, 27
のいずれかです
• 20 歳ですか?
• 21 歳ですか?
• 22 歳ですか?
• …
• 27 歳ですか?
・Yes になる...
71
効率良く絞る方法 (二分探索)
• 24 歳未満ですか? ][
20 21 22 23 24 25 26 27
24 未満?
/ 99
72
効率良く絞る方法 (二分探索)
• 24 歳未満ですか?
• Yes でも No でも
選択肢が半減!
Yes
][
20 21 22 23 24 25 26 27
][
20 21 22 23
][
24 25 26 27
24 未満?...
73
効率良く絞る方法 (二分探索)
Yes
][
20 21 22 23 24 25 26 27
][
20 21 22 23
][
24 25 26 27
][
20 21
][
22 23
][
24 25
][
26 27
24 未満?...
効率良く絞る方法 (二分探索)
Yes
][
20 21 22 23 24 25 26 27
][
20 21 22 23
][
24 25 26 27
][
20 21
][
22 23
][
24 25
][
26 27
24 未満?
22...
75
二分探索の応用
• データベース中の目的のキーの検索 (古典的)
• プログラムのバグ発生箇所の特定
• スケジューリングへの応用も!
• 従業員の労働時間を平準化したい
• 最も働いている従業員の労働時間を最小にする
• その他、プログ...
76
本日の講演内容
• アルゴリズムの設計技法の紹介
• アルゴリズムの速度性能向上に関する話
• まとめ
/ 99
77
計算量オーダー
• 一般に、同じ問題を解くアルゴリズムはいくつも
考えられる
• アルゴリズムによって、計算実行時間にとてつも
ない差が生じる
• 計算量オーダーを学ぶと、考案したアルゴリズムを
実装することなく、予め計算実行時間を大雑把...
78
アルゴリズムによる効率差
A さんが 20 歳以上 28 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:7 回 (...
79
アルゴリズムによる効率差
A さんが 0 歳以上 65536 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:655...
80
アルゴリズムによる効率差
A さんが 0 歳以上 65536 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:655...
81
世の中の問題の規模感
この辺りから、単純なアルゴリズムでは間に合わない
/ 99
82
よくある誤ったイメージ
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間はかならず 10 倍になる
/ 99
83
よくある誤ったイメージ
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間はかならず 10 倍になる
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間も 10 倍になることもある (割と高速!)
• 100 倍に...
84
計算量オーダーとは
• 問題のサイズ   に応じて、どのくらいの計算時間を
要するのかを見積もる「ものさし」
N
・・・ に比例する計算時間 (速い)N
・・・ に比例する計算時間 (遅い)N2
for i in range(N):
fo...
85
問題例
空のデータベースにデータを順に挿入したい。
最後に挿入されたものが先頭に来るようにしたい。
ex: 鈴木君, 渡辺君, 青木君
(青木君, 渡辺君, 鈴木君)
/ 99
86
問題例
方法 1 方法 2
リストの先頭に挿入していく リストの末尾に挿入していく
最後に reverse する
(ここでは Python を使用)
(青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転
ex: 鈴木君,...
87
問題例
方法 1 方法 2
リストの先頭に挿入していく リストの末尾に挿入していく
最後に reverse する
(ここでは Python を使用)
(青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転
ex: 鈴木君,...
88
   と    の圧倒的な差O(N) O(N2
)
MacBook Air (13-inch, Early 2015)
プロセッサ: 1.6 GHz Intel Core i5
/ 99
89
   と    の圧倒的な差O(N) O(N2
)
MacBook Air (13-inch, Early 2015)
プロセッサ: 1.6 GHz Intel Core i5
100 倍
/ 99
90
個人的な高速化事例
2 つのデータ系列の「共通の要素」の個数が知りたい
・a[0], a[1], …, a[N-1]
・b[0], b[1], …, b[N-1]
a = [3, 1, 4, 6, 5]
b = [2, 4, 3, 7, ...
91
個人的な高速化事例
2 つのデータ系列の「共通の要素」の個数が知りたい
・a[0], a[1], …, a[N-1]
・b[0], b[1], …, b[N-1]
a = [3, 1, 4, 6, 5]
b = [2, 4, 3, 7, ...
92 / 88
個人的な高速化事例
2 つのデータ系列の「共通の要素」の個数が知りたい
・a[0], a[1], …, a[N-1]
・b[0], b[1], …, b[N-1]
a = [3, 1, 4, 6, 5]
b = [2, 4, 3...
93 / 88
個人的な高速化事例
2 つのデータ系列の「共通の要素」の個数が知りたい
・a[0], a[1], …, a[N-1]
・b[0], b[1], …, b[N-1]
a = [3, 1, 4, 6, 5]
b = [2, 4, 3...
94 / 88
個人的な高速化事例
2 つのデータ系列の「共通の要素」の個数が知りたい
・a[0], a[1], …, a[N-1]
・b[0], b[1], …, b[N-1]
a = [3, 1, 4, 6, 5]
b = [2, 4, 3...
95
速度改善のための設計技法 (一例)
問題
なんらかの解法
深さ優先探索など
などO(N2
)
動的計画法など
O(N log N) など
二分探索法や、
各種データ構造など
/ 99
96
計算量オーダーのまとめ
• 問題のサイズ   に応じて、どのくらいの計算時間を
要するのかを見積もる「ものさし」
N
• 計算量オーダーを考えることで、アルゴリズムの計算
時間を大雑把に見積もることができる
• どのアルゴリズムを使おうか...
97
本日の講演内容
• アルゴリズムの設計技法の紹介
• アルゴリズムの速度性能向上に関する話
• まとめ
/ 99
98
本日の内容と書籍の対応
1章 - アルゴリズムとは
2章 - 計算量とオーダー記法
3章 - 設計技法(1):全探索
4章 - 設計技法(2):再帰
5章 - 設計技法(3):動的計画法
6章 - 設計技法(4):二分探索法
7章 - 設...
99
アルゴリズムを学ぶ意義 (まとめ)
• 時代や流行の変化にとらわれず、様々な分野の問題を
解決する (AI を学ぶ上での強力な下地にもなる)
• 世の中に溢れるライブラリなどの速度性能向上の勘所を
つかんだり、より上手に応用したりできるよ...
Nächste SlideShare
Wird geladen in …5
×

『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演

『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演での資料です。

  • Als Erste(r) kommentieren

『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演

  1. 1. 問題解決力を鍛える! アルゴリズムとデータ構造 出版記念講演会 大槻 兼資 (ペンネーム: けんちょん) 2020/10/29 @数理システムセミナールーム 1
  2. 2. • 2014年:東京大学大学院情報理工学系研究科 数理情報学専攻修士課程修了 自己紹介 (本業編) • 2015年~:NTT データ数理システム • 専門は数理工学全般 • アルゴリズム • 探索, ネットワーク, etc… • 数理最適化 • シフトスケジューリングなど • 機械学習 • チャットボットなど http://www.dis.uniroma1.it/challenge9/download.shtml 2 / 99
  3. 3. 3 自己紹介 (趣味編) (10月29日) (7 の形) (1234567890 で「コ」) • 虫食算作り • コミケなどにも出店 • オーム社雑誌「ロボコンマガジン」の懸賞担当 / 99
  4. 4. • 虫食算作り • コミケなどにも出店 • オーム社雑誌「ロボコンマガジン」の懸賞担当 自己紹介 (趣味編) (全部虫食い) (たのしい) (将棋: 美濃囲い)
  5. 5. 5 アルゴリズムとは • ある問題を解くための方法、手順のこと • それを実装したものがプログラム 「うまくやるための手順書」 というイメージ https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
  6. 6. 6 アルゴリズムの身近な例 • 料理のレシピ • ゲームの攻略法 • 英単語の辞書での調べ方 • 3 の倍数の判定方法 / 99
  7. 7. 7 なぜアルゴリズムなのか • AI や量子コンピュータなどの、分野の流行に依らない 一生モノのスキル • むしろ AI を学ぶための強力な下地となる • さまざまな分野で、問題解決に寄与する • インフラ, サービス, 金融, 物流, 製造, 公共, ヘルスケア, etc… • 世の中に溢れるライブラリなどの速度性能向上の勘所を つかんだり、より上手に応用したりできるようになる / 99
  8. 8. 8 アルゴリズム本に込めた想い • アルゴリズムは、実際の問題解決に活かしてナンボ • 「~法」の知識の紹介だけでは終わらない • 「具体的な問題の解き方」を詳しく解説 • アルゴリズムは楽しい
  9. 9. 9 アルゴリズム本に込めた想い 設計技法 ・本の最初に設計技法を特集 ・本の全体で設計技法を使用
  10. 10. 10 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 • まとめ / 99
  11. 11. 11 様々なアルゴリズム技法 • 探索 • 二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
  12. 12. 12 様々なアルゴリズム技法 • 探索 • 二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ 今日 / 99
  13. 13. 13 様々なアルゴリズム技法 • 探索 • 二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ 今日 数理システムでも 動的計画法で解決した問題 多数!!
  14. 14. 14 グラフ • 物事の関係性を「丸」と「線」を用いて表したもの • コンピュータサイエンスのあらゆる領域で使われる / 99
  15. 15. 15 グラフ • ありとあらゆるモノをグラフで表せる! • さまざまな分野の問題をグラフに関する問題として 見通よく統一的に扱える!
  16. 16. 16 深さ優先探索 • 数独ソルバーを作ることを考える https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC / 99
  17. 17. 17 深さ優先探索 • 数独を解く過程もグラフで表せる! 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 2 32 2 1 1 31 2 3 https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC / 99
  18. 18. 18 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 / 99
  19. 19. 19 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る / 99
  20. 20. 20 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る / 99
  21. 21. 21 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る / 99
  22. 22. 22 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 1 2 2 32 2 1 1 / 99
  23. 23. 23 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 1 2 2 32 2 1 1 / 99
  24. 24. 24 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 / 99
  25. 25. 25 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 1 2 1 2 32 2 1 1 / 99
  26. 26. 26 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 1 2 1 2 32 2 1 1 / 99
  27. 27. 27 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 2 1 2 2 32 2 1 1 / 99
  28. 28. 28 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 2 1 2 2 32 2 1 1 / 99
  29. 29. 29 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 / 99
  30. 30. 30 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 / 99
  31. 31. 31 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 / 99
  32. 32. 32 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 / 99
  33. 33. 33 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 / 99
  34. 34. 34 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 3 1 / 99
  35. 35. 35 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 3 1 / 99
  36. 36. 36 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 1 2 / 99
  37. 37. 37 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 1 2 / 99
  38. 38. 38 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 2 32 2 1 1 31 2 3 / 99
  39. 39. 39 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 2 32 2 1 1 31 2 3 / 99
  40. 40. 40 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る 2 32 2 1 1 1 2 32 2 1 1 2 32 2 1 1 32 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 11 2 3 2 32 2 1 1 12 32 2 1 1 1 2 32 2 1 1 12 2 3 1 2 3 2 32 2 1 1 2 32 2 1 1 32 32 2 1 1 3 2 32 2 1 1 31 2 3 終了! / 99
  41. 41. 41 深さ優先探索の応用 • 数独ソルバー • https://github.com/drken1215/sudoku • 虫食算ソルバーも同様に作れる • コンピュータ将棋 AI の探索ルーチン • makefile などのビルドシステム • 動的計画法 (後述) にもつながる • ネットワークの輸送経路の確保 http://www.dis.uniroma1.it/challenge9/download.shtml
  42. 42. 深さ優先探索のポイント • 「目の付け所」がとても大事! • 探索順序を工夫したり…探索不要なところを見出したり • 数独なら、選択肢が少なそうなマスから順に考えるなど
  43. 43. スケジューリング案件などでも • どの従業員をどのシフトに割り当てるか? → 探索 • 自由度の小さいところから先に割り当てるなど • Nuopt の node selection • 他に「とりあえず割り当ててみてひたすら改良」という アプローチも有効
  44. 44. Yes / No チャート • FAQ やトラブルシューティング • 刑法適用ロジックなども https://www.digitalbook-meclib.jp/tips/detail/yesno-chart/ Yes / No の視点の順序 を工夫することでより コンパクトな表現 Decision Diagram 突き詰めると… 44 / 99
  45. 45. Decision Diagram で広がる応用 • 様々なネットワークの解析や最適設計 • 電力解析網 • 鉄道経路探索 • 割当問題 • 選挙区割当 • 住民のフロアプランの列挙 • テキストマイニングへの応用も • 頻出ワードマイニング • 文字列集合の表現 45 https://www.youtube.com/watch?feature= player_embedded&v=Q4gTV4r0zRs / 99
  46. 46. 46 様々なアルゴリズム技法 (再掲) • 探索 • 二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
  47. 47. 47 幅優先探索 • 迷路の最短路を求めよう! • スタート (S) からゴール (G) への最短経路は? / 99
  48. 48. 48 幅優先探索 • 迷路の最短路を求めよう! • スタート (S) からゴール (G) への最短経路は? これもグラフ! / 99
  49. 49. 49 幅優先探索 • まず S から 1 手で行けるマスに「1」と書く / 99
  50. 50. 50 幅優先探索 • 次に「1」から 1 手で行けるマスに「2」と書く / 99
  51. 51. 51 幅優先探索 • 「2」から 1 手で行けるマスに「3」と書く / 99
  52. 52. 52 幅優先探索 • 「3」から 1 手で行けるマスに「4」と書く / 99
  53. 53. 53 幅優先探索 • 「4」から 1 手で行けるマスに「5」と書く / 99
  54. 54. 54 幅優先探索 • 「5」から 1 手で行けるマスに「6」と書く / 99
  55. 55. 55 幅優先探索 • 「6」から 1 手で行けるマスに「7」と書く / 99
  56. 56. 56 幅優先探索 • 「7」から 1 手で行けるマスに「8」と書く / 99
  57. 57. 57 幅優先探索 • 「8」から 1 手で行けるマスに「9」と書く / 99
  58. 58. 58 幅優先探索 • 「9」から 1 手で行けるマスに「10」と書く / 99
  59. 59. 59 幅優先探索 • 「10」から 1 手で行けるマスに「11」と書く / 99
  60. 60. 60 幅優先探索 • 「11」から 1 手で行けるマスに「12」と書く / 99
  61. 61. 61 幅優先探索 • 「12」から 1 手で行けるマスに「13」と書く / 99
  62. 62. 62 幅優先探索 • 「13」から 1 手で行けるマスに「14」と書く / 99
  63. 63. 63 幅優先探索 • 「14」から 1 手で行けるマスに「15」と書く / 99
  64. 64. 64 幅優先探索 • 「15」から 1 手で行けるマスに「16」と書く • これでゴール!!! / 99
  65. 65. 65 幅優先探索 • ゴールから、「数値が 1 ずつ下がっていくように」 遡っていくと、最短経路が得られる / 99
  66. 66. 66 幅優先探索の応用 • カーナビ • 電車の乗り換え案内 • パズル (15-パズルなど) の最小手数 https://www.amazon.co.jp/dp/B071J2XFS6
  67. 67. 67 最短経路問題 - 実応用に向けて • 道路の長さも考慮 • ダイクストラ法などより高度なアルゴリズムへ • 道路の交通状況も考慮 • 「ここを通ると嬉しい」というボーナスも • ベルマンフォード法などより高度なアルゴリズムへ • 街の構造なども利用して高速化したり
  68. 68. 68 様々なアルゴリズム技法 (再掲) • 探索 • 二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
  69. 69. 69 二分探索 A さんの年齢を当てたいとします A さんが 20 歳以上 28 歳未満であることはわかっている Yes / No で答えられる質問を 3 回まで行える A さんの年齢を当てることは可能か? 私は何歳でしょう? 20, 21, 22, 23, 24, 25, 26, 27 のいずれかです / 99
  70. 70. 70 効率悪い方法 (線形探索) 私は何歳でしょう? 20, 21, 22, 23, 24, 25, 26, 27 のいずれかです • 20 歳ですか? • 21 歳ですか? • 22 歳ですか? • … • 27 歳ですか? ・Yes になるまで順に聞く ・最悪 7 回聞く必要がある / 99
  71. 71. 71 効率良く絞る方法 (二分探索) • 24 歳未満ですか? ][ 20 21 22 23 24 25 26 27 24 未満? / 99
  72. 72. 72 効率良く絞る方法 (二分探索) • 24 歳未満ですか? • Yes でも No でも 選択肢が半減! Yes ][ 20 21 22 23 24 25 26 27 ][ 20 21 22 23 ][ 24 25 26 27 24 未満? No / 99
  73. 73. 73 効率良く絞る方法 (二分探索) Yes ][ 20 21 22 23 24 25 26 27 ][ 20 21 22 23 ][ 24 25 26 27 ][ 20 21 ][ 22 23 ][ 24 25 ][ 26 27 24 未満? 22 未満? 26 未満? No Yes No Yes No • 2 回目の質問で さらに半減! / 99
  74. 74. 効率良く絞る方法 (二分探索) Yes ][ 20 21 22 23 24 25 26 27 ][ 20 21 22 23 ][ 24 25 26 27 ][ 20 21 ][ 22 23 ][ 24 25 ][ 26 27 24 未満? 22 未満? 26 未満? No Yes No Yes No • 2 回目の質問で さらに半減! 20 21 Yes No 22 23 Yes No 24 25 Yes No 26 27 Yes No 20? 22? 24? 26? • 3 回目の質問で 完全に絞れる
  75. 75. 75 二分探索の応用 • データベース中の目的のキーの検索 (古典的) • プログラムのバグ発生箇所の特定 • スケジューリングへの応用も! • 従業員の労働時間を平準化したい • 最も働いている従業員の労働時間を最小にする • その他、プログラムの効率化に寄与するケース多数!! • 「実は二分探索で効率化できる場面」は非常に多い / 99
  76. 76. 76 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 • まとめ / 99
  77. 77. 77 計算量オーダー • 一般に、同じ問題を解くアルゴリズムはいくつも 考えられる • アルゴリズムによって、計算実行時間にとてつも ない差が生じる • 計算量オーダーを学ぶと、考案したアルゴリズムを 実装することなく、予め計算実行時間を大雑把に見 積もれるようになる / 99
  78. 78. 78 アルゴリズムによる効率差 A さんが 20 歳以上 28 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:7 回 (順に聞いていく方法) • 二分探索法:3 回 (半減していく方法) / 99
  79. 79. 79 アルゴリズムによる効率差 A さんが 0 歳以上 65536 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:65535 回 (順に聞いていく方法) • 二分探索法:16 回 (半減していく方法) / 99
  80. 80. 80 アルゴリズムによる効率差 A さんが 0 歳以上 65536 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:65535 回 (順に聞いていく方法) • 二分探索法:16 回 (半減していく方法) 問題の規模が大きくなると、とてつもない差になる!! / 99
  81. 81. 81 世の中の問題の規模感 この辺りから、単純なアルゴリズムでは間に合わない / 99
  82. 82. 82 よくある誤ったイメージ • プログラムは、10 倍のサイズのデータを扱うと、 所要時間はかならず 10 倍になる / 99
  83. 83. 83 よくある誤ったイメージ • プログラムは、10 倍のサイズのデータを扱うと、 所要時間はかならず 10 倍になる • プログラムは、10 倍のサイズのデータを扱うと、 所要時間も 10 倍になることもある (割と高速!) • 100 倍になることもある • 1000 倍になることもある • 2~3 倍で済むこともある (超高速) / 99
  84. 84. 84 計算量オーダーとは • 問題のサイズ   に応じて、どのくらいの計算時間を 要するのかを見積もる「ものさし」 N ・・・ に比例する計算時間 (速い)N ・・・ に比例する計算時間 (遅い)N2 for i in range(N): for i in range(N): for j in range(N): サイズ 10 倍で 10 倍 サイズ 10 倍で 100 倍 / 99
  85. 85. 85 問題例 空のデータベースにデータを順に挿入したい。 最後に挿入されたものが先頭に来るようにしたい。 ex: 鈴木君, 渡辺君, 青木君 (青木君, 渡辺君, 鈴木君) / 99
  86. 86. 86 問題例 方法 1 方法 2 リストの先頭に挿入していく リストの末尾に挿入していく 最後に reverse する (ここでは Python を使用) (青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転 ex: 鈴木君, 渡辺君, 青木君 (青木君, 渡辺君, 鈴木君)
  87. 87. 87 問題例 方法 1 方法 2 リストの先頭に挿入していく リストの末尾に挿入していく 最後に reverse する (ここでは Python を使用) (青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転 ex: 鈴木君, 渡辺君, 青木君 (青木君, 渡辺君, 鈴木君)
  88. 88. 88    と    の圧倒的な差O(N) O(N2 ) MacBook Air (13-inch, Early 2015) プロセッサ: 1.6 GHz Intel Core i5 / 99
  89. 89. 89    と    の圧倒的な差O(N) O(N2 ) MacBook Air (13-inch, Early 2015) プロセッサ: 1.6 GHz Intel Core i5 100 倍 / 99
  90. 90. 90 個人的な高速化事例 2 つのデータ系列の「共通の要素」の個数が知りたい ・a[0], a[1], …, a[N-1] ・b[0], b[1], …, b[N-1] a = [3, 1, 4, 6, 5] b = [2, 4, 3, 7, 8] → 2 個 / 99
  91. 91. 91 個人的な高速化事例 2 つのデータ系列の「共通の要素」の個数が知りたい ・a[0], a[1], …, a[N-1] ・b[0], b[1], …, b[N-1] a = [3, 1, 4, 6, 5] b = [2, 4, 3, 7, 8] → 2 個 • 「処理が遅い」と友人から相談を受けた / 99
  92. 92. 92 / 88 個人的な高速化事例 2 つのデータ系列の「共通の要素」の個数が知りたい ・a[0], a[1], …, a[N-1] ・b[0], b[1], …, b[N-1] a = [3, 1, 4, 6, 5] b = [2, 4, 3, 7, 8] → 2 個 • 「処理が遅い」と友人から相談を受けた
  93. 93. 93 / 88 個人的な高速化事例 2 つのデータ系列の「共通の要素」の個数が知りたい ・a[0], a[1], …, a[N-1] ・b[0], b[1], …, b[N-1] a = [3, 1, 4, 6, 5] b = [2, 4, 3, 7, 8] → 2 個 • 「処理が遅い」と友人から相談を受けた
  94. 94. 94 / 88 個人的な高速化事例 2 つのデータ系列の「共通の要素」の個数が知りたい ・a[0], a[1], …, a[N-1] ・b[0], b[1], …, b[N-1] a = [3, 1, 4, 6, 5] b = [2, 4, 3, 7, 8] → 2 個 • 「処理が遅い」と友人から相談を受けた if v in (リスト): は実は遅い!
  95. 95. 95 速度改善のための設計技法 (一例) 問題 なんらかの解法 深さ優先探索など などO(N2 ) 動的計画法など O(N log N) など 二分探索法や、 各種データ構造など / 99
  96. 96. 96 計算量オーダーのまとめ • 問題のサイズ   に応じて、どのくらいの計算時間を 要するのかを見積もる「ものさし」 N • 計算量オーダーを考えることで、アルゴリズムの計算 時間を大雑把に見積もることができる • どのアルゴリズムを使おうか、考える際の比較検討に も役立つ / 99
  97. 97. 97 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 • まとめ / 99
  98. 98. 98 本日の内容と書籍の対応 1章 - アルゴリズムとは 2章 - 計算量とオーダー記法 3章 - 設計技法(1):全探索 4章 - 設計技法(2):再帰 5章 - 設計技法(3):動的計画法 6章 - 設計技法(4):二分探索法 7章 - 設計技法(5):貪欲法 8~10章 - データ構造 11章 - Union-Find 12章 - ソート 13~16章 - グラフアルゴリズム 17章 - P と NP 18章 - 難問対策 実応用多数なのでぜひ! 年齢当てゲーム 計算量オーダー Python のリストの効率 深さ優先探索 幅優先探索, ダイクストラ法 実務家の視点も / 99
  99. 99. 99 アルゴリズムを学ぶ意義 (まとめ) • 時代や流行の変化にとらわれず、様々な分野の問題を 解決する (AI を学ぶ上での強力な下地にもなる) • 世の中に溢れるライブラリなどの速度性能向上の勘所を つかんだり、より上手に応用したりできるようになる • 論理的思考力が磨かれ、明快なロジックを考えられる ようになる • 純粋に楽しい! / 99

×