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

Kensuke Otsuki
Kensuke OtsukiResearcher at NTT DATA MSI
問題解決力を鍛える!
アルゴリズムとデータ構造
出版記念講演会
大槻 兼資
(ペンネーム: けんちょん)
2020/10/29
@数理システムセミナールーム
1
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年~:NTT データ数理システム
• 専門は数理工学全般
• アルゴリズム
• 探索, ネットワーク, etc…
• 数理最適化
• シフトスケジューリングなど
• 機械学習
• チャットボットなど
http://www.dis.uniroma1.it/challenge9/download.shtml 2 / 99
3
自己紹介 (趣味編)
(10月29日) (7 の形) (1234567890 で「コ」)
• 虫食算作り
• コミケなどにも出店
• オーム社雑誌「ロボコンマガジン」の懸賞担当
/ 99
• 虫食算作り
• コミケなどにも出店
• オーム社雑誌「ロボコンマガジン」の懸賞担当
自己紹介 (趣味編)
(全部虫食い) (たのしい) (将棋: 美濃囲い)
5
アルゴリズムとは
• ある問題を解くための方法、手順のこと
• それを実装したものがプログラム
「うまくやるための手順書」
というイメージ
https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
6
アルゴリズムの身近な例
• 料理のレシピ
• ゲームの攻略法
• 英単語の辞書での調べ方
• 3 の倍数の判定方法
/ 99
7
なぜアルゴリズムなのか
• AI や量子コンピュータなどの、分野の流行に依らない
一生モノのスキル
• むしろ AI を学ぶための強力な下地となる
• さまざまな分野で、問題解決に寄与する
• インフラ, サービス, 金融, 物流, 製造, 公共, ヘルスケア, etc…
• 世の中に溢れるライブラリなどの速度性能向上の勘所を
つかんだり、より上手に応用したりできるようになる
/ 99
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
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
1
/ 99
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
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
深さ優先探索の応用
• 数独ソルバー
• https://github.com/drken1215/sudoku
• 虫食算ソルバーも同様に作れる
• コンピュータ将棋 AI の探索ルーチン
• makefile などのビルドシステム
• 動的計画法 (後述) にもつながる
• ネットワークの輸送経路の確保
http://www.dis.uniroma1.it/challenge9/download.shtml
深さ優先探索のポイント
• 「目の付け所」がとても大事!
• 探索順序を工夫したり…探索不要なところを見出したり
• 数独なら、選択肢が少なそうなマスから順に考えるなど
スケジューリング案件などでも
• どの従業員をどのシフトに割り当てるか? → 探索
• 自由度の小さいところから先に割り当てるなど
• Nuopt の node selection
• 他に「とりあえず割り当ててみてひたすら改良」という
アプローチも有効
Yes / No チャート
• FAQ やトラブルシューティング
• 刑法適用ロジックなども
https://www.digitalbook-meclib.jp/tips/detail/yesno-chart/
Yes / No の視点の順序
を工夫することでより
コンパクトな表現
Decision Diagram
突き詰めると…
44 / 99
Decision Diagram で広がる応用
• 様々なネットワークの解析や最適設計
• 電力解析網
• 鉄道経路探索
• 割当問題
• 選挙区割当
• 住民のフロアプランの列挙
• テキストマイニングへの応用も
• 頻出ワードマイニング
• 文字列集合の表現
45
https://www.youtube.com/watch?feature=
player_embedded&v=Q4gTV4r0zRs
/ 99
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, 22, 23, 24, 25, 26, 27
のいずれかです
/ 99
70
効率悪い方法 (線形探索)
私は何歳でしょう?
20, 21, 22, 23, 24, 25, 26, 27
のいずれかです
• 20 歳ですか?
• 21 歳ですか?
• 22 歳ですか?
• …
• 27 歳ですか?
・Yes になるまで順に聞く
・最悪 7 回聞く必要がある
/ 99
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 未満?
No
/ 99
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
効率良く絞る方法 (二分探索)
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
二分探索の応用
• データベース中の目的のキーの検索 (古典的)
• プログラムのバグ発生箇所の特定
• スケジューリングへの応用も!
• 従業員の労働時間を平準化したい
• 最も働いている従業員の労働時間を最小にする
• その他、プログラムの効率化に寄与するケース多数!!
• 「実は二分探索で効率化できる場面」は非常に多い
/ 99
76
本日の講演内容
• アルゴリズムの設計技法の紹介
• アルゴリズムの速度性能向上に関する話
• まとめ
/ 99
77
計算量オーダー
• 一般に、同じ問題を解くアルゴリズムはいくつも
考えられる
• アルゴリズムによって、計算実行時間にとてつも
ない差が生じる
• 計算量オーダーを学ぶと、考案したアルゴリズムを
実装することなく、予め計算実行時間を大雑把に見
積もれるようになる
/ 99
78
アルゴリズムによる効率差
A さんが 20 歳以上 28 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:7 回 (順に聞いていく方法)
• 二分探索法:3 回 (半減していく方法)
/ 99
79
アルゴリズムによる効率差
A さんが 0 歳以上 65536 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:65535 回 (順に聞いていく方法)
• 二分探索法:16 回 (半減していく方法)
/ 99
80
アルゴリズムによる効率差
A さんが 0 歳以上 65536 歳未満であることがわかっている
Yes / No で答えられる質問をしていく
できるだけ少ない回数で A さんの年齢を当てたい
年齢当てゲーム (再掲)
• 線形探索法:65535 回 (順に聞いていく方法)
• 二分探索法:16 回 (半減していく方法)
問題の規模が大きくなると、とてつもない差になる!!
/ 99
81
世の中の問題の規模感
この辺りから、単純なアルゴリズムでは間に合わない
/ 99
82
よくある誤ったイメージ
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間はかならず 10 倍になる
/ 99
83
よくある誤ったイメージ
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間はかならず 10 倍になる
• プログラムは、10 倍のサイズのデータを扱うと、
所要時間も 10 倍になることもある (割と高速!)
• 100 倍になることもある
• 1000 倍になることもある
• 2~3 倍で済むこともある (超高速)
/ 99
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
問題例
空のデータベースにデータを順に挿入したい。
最後に挿入されたものが先頭に来るようにしたい。
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, 8]
→ 2 個
/ 99
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 / 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 / 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 / 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
速度改善のための設計技法 (一例)
問題
なんらかの解法
深さ優先探索など
などO(N2
)
動的計画法など
O(N log N) など
二分探索法や、
各種データ構造など
/ 99
96
計算量オーダーのまとめ
• 問題のサイズ   に応じて、どのくらいの計算時間を
要するのかを見積もる「ものさし」
N
• 計算量オーダーを考えることで、アルゴリズムの計算
時間を大雑把に見積もることができる
• どのアルゴリズムを使おうか、考える際の比較検討に
も役立つ
/ 99
97
本日の講演内容
• アルゴリズムの設計技法の紹介
• アルゴリズムの速度性能向上に関する話
• まとめ
/ 99
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
アルゴリズムを学ぶ意義 (まとめ)
• 時代や流行の変化にとらわれず、様々な分野の問題を
解決する (AI を学ぶ上での強力な下地にもなる)
• 世の中に溢れるライブラリなどの速度性能向上の勘所を
つかんだり、より上手に応用したりできるようになる
• 論理的思考力が磨かれ、明快なロジックを考えられる
ようになる
• 純粋に楽しい!
/ 99
1 of 99

More Related Content

What's hot(20)

指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata44.7K views
Tokyo r27Tokyo r27
Tokyo r27
Takashi Minoda855 views
強化学習その3強化学習その3
強化学習その3
nishio26.7K views
20170408cvsaisentan6 2 4.3-4.520170408cvsaisentan6 2 4.3-4.5
20170408cvsaisentan6 2 4.3-4.5
Takuya Minagawa3.1K views
様々な全域木問題様々な全域木問題
様々な全域木問題
tmaehara37.7K views
2章グラフ理論スピード入門2章グラフ理論スピード入門
2章グラフ理論スピード入門
Teruo Kawasaki20.6K views
双対性双対性
双対性
Yoichi Iwata25.8K views

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