SlideShare a Scribd company logo
Submit Search
Upload
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
Report
Kensuke Otsuki
Researcher at NTT DATA MSI
Follow
•
5 likes
•
4,553 views
1
of
99
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
•
5 likes
•
4,553 views
Download Now
Download to read offline
Report
Technology
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演での資料です。
Read more
Kensuke Otsuki
Researcher at NTT DATA MSI
Follow
Recommended
210122 msi dp
Kensuke Otsuki
287 views
•
67 slides
Optimization night 4_dp
Kensuke Otsuki
695 views
•
53 slides
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
Kensuke Otsuki
293 views
•
153 slides
JOI春季ステップアップセミナー 2021 講義スライド
Kensuke Otsuki
445 views
•
115 slides
虫食算を作るアルゴリズム 公表Ver
Kensuke Otsuki
2.3K views
•
70 slides
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
Kensuke Otsuki
981 views
•
150 slides
More Related Content
What's hot
楕円曲線入門トーラスと楕円曲線のつながり
MITSUNARI Shigeo
18K views
•
59 slides
“Sliding right into disaster”の紹介
MITSUNARI Shigeo
2K views
•
15 slides
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
Shuyo Nakatani
3.5K views
•
43 slides
大規模グラフアルゴリズムの最先端
Takuya Akiba
54.4K views
•
51 slides
指数時間アルゴリズム入門
Yoichi Iwata
44.7K views
•
98 slides
Tokyo r27
Takashi Minoda
855 views
•
30 slides
What's hot
(20)
楕円曲線入門トーラスと楕円曲線のつながり
MITSUNARI Shigeo
•
18K views
“Sliding right into disaster”の紹介
MITSUNARI Shigeo
•
2K views
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
Shuyo Nakatani
•
3.5K views
大規模グラフアルゴリズムの最先端
Takuya Akiba
•
54.4K views
指数時間アルゴリズム入門
Yoichi Iwata
•
44.7K views
Tokyo r27
Takashi Minoda
•
855 views
強化学習その3
nishio
•
26.7K views
大規模ネットワークの性質と先端グラフアルゴリズム
Takuya Akiba
•
15.3K views
指数時間アルゴリズムの最先端
Yoichi Iwata
•
10.2K views
「深層学習」第6章 畳込みニューラルネット
Ken'ichi Matsui
•
60K views
20170408cvsaisentan6 2 4.3-4.5
Takuya Minagawa
•
3.1K views
深層ニューラルネットワークによる知識の自動獲得・推論
Naoaki Okazaki
•
15.3K views
様々な全域木問題
tmaehara
•
37.7K views
2章グラフ理論スピード入門
Teruo Kawasaki
•
20.6K views
双対性
Yoichi Iwata
•
25.8K views
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
•
26.8K views
平面グラフと交通ネットワークのアルゴリズム
Takuya Akiba
•
26.2K views
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
•
31.2K views
大規模グラフ解析のための乱択スケッチ技法
Takuya Akiba
•
38.1K views
有向グラフに対する 非線形ラプラシアンと ネットワーク解析
Yuichi Yoshida
•
7.2K views
More from Kensuke Otsuki
競プロは人生の役に立つ!
Kensuke Otsuki
145 views
•
102 slides
人それぞれの競プロとの向き合い方
Kensuke Otsuki
227 views
•
43 slides
IT エンジニア本大賞 2021 講演資料
Kensuke Otsuki
141 views
•
10 slides
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
Kensuke Otsuki
1.9K views
•
42 slides
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
Kensuke Otsuki
6.7K views
•
94 slides
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
6.4K views
•
16 slides
More from Kensuke Otsuki
(7)
競プロは人生の役に立つ!
Kensuke Otsuki
•
145 views
人それぞれの競プロとの向き合い方
Kensuke Otsuki
•
227 views
IT エンジニア本大賞 2021 講演資料
Kensuke Otsuki
•
141 views
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
Kensuke Otsuki
•
1.9K views
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
Kensuke Otsuki
•
6.7K views
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
•
6.4K views
2部グラフの最小点被覆の求め方
Kensuke Otsuki
•
1.8K views
Recently uploaded
概念モデリングワークショップ 基礎編
Knowledge & Experience
18 views
•
71 slides
概念モデリングワークショップ 設計編
Knowledge & Experience
10 views
•
37 slides
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
6 views
•
34 slides
JJUG CCC.pptx
Kanta Sasaki
6 views
•
14 slides
01Booster Studio ご紹介資料
ssusere7a2172
186 views
•
19 slides
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
harmonylab
38 views
•
30 slides
Recently uploaded
(10)
概念モデリングワークショップ 基礎編
Knowledge & Experience
•
18 views
概念モデリングワークショップ 設計編
Knowledge & Experience
•
10 views
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
•
6 views
JJUG CCC.pptx
Kanta Sasaki
•
6 views
01Booster Studio ご紹介資料
ssusere7a2172
•
186 views
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
harmonylab
•
38 views
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
119 views
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
197 views
さくらのひやおろし2023
法林浩之
•
24 views
テストコードってすごい.pptx
cistb220msudou
•
71 views
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
1.
問題解決力を鍛える! アルゴリズムとデータ構造 出版記念講演会 大槻 兼資 (ペンネーム: けんちょん) 2020/10/29 @数理システムセミナールーム 1
2.
• 2014年:東京大学大学院情報理工学系研究科 数理情報学専攻修士課程修了 自己紹介 (本業編) •
2015年~:NTT データ数理システム • 専門は数理工学全般 • アルゴリズム • 探索, ネットワーク, etc… • 数理最適化 • シフトスケジューリングなど • 機械学習 • チャットボットなど http://www.dis.uniroma1.it/challenge9/download.shtml 2 / 99
3.
3 自己紹介 (趣味編) (10月29日) (7
の形) (1234567890 で「コ」) • 虫食算作り • コミケなどにも出店 • オーム社雑誌「ロボコンマガジン」の懸賞担当 / 99
4.
• 虫食算作り • コミケなどにも出店 •
オーム社雑誌「ロボコンマガジン」の懸賞担当 自己紹介 (趣味編) (全部虫食い) (たのしい) (将棋: 美濃囲い)
5.
5 アルゴリズムとは • ある問題を解くための方法、手順のこと • それを実装したものがプログラム 「うまくやるための手順書」 というイメージ https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
6.
6 アルゴリズムの身近な例 • 料理のレシピ • ゲームの攻略法 •
英単語の辞書での調べ方 • 3 の倍数の判定方法 / 99
7.
7 なぜアルゴリズムなのか • AI や量子コンピュータなどの、分野の流行に依らない 一生モノのスキル •
むしろ AI を学ぶための強力な下地となる • さまざまな分野で、問題解決に寄与する • インフラ, サービス, 金融, 物流, 製造, 公共, ヘルスケア, etc… • 世の中に溢れるライブラリなどの速度性能向上の勘所を つかんだり、より上手に応用したりできるようになる / 99
8.
8 アルゴリズム本に込めた想い • アルゴリズムは、実際の問題解決に活かしてナンボ • 「~法」の知識の紹介だけでは終わらない •
「具体的な問題の解き方」を詳しく解説 • アルゴリズムは楽しい
9.
9 アルゴリズム本に込めた想い 設計技法 ・本の最初に設計技法を特集 ・本の全体で設計技法を使用
10.
10 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 •
まとめ / 99
11.
11 様々なアルゴリズム技法 • 探索 • 二分探索
(例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
12.
12 様々なアルゴリズム技法 • 探索 • 二分探索
(例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ 今日 / 99
13.
13 様々なアルゴリズム技法 • 探索 • 二分探索
(例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ 今日 数理システムでも 動的計画法で解決した問題 多数!!
14.
14 グラフ • 物事の関係性を「丸」と「線」を用いて表したもの • コンピュータサイエンスのあらゆる領域で使われる /
99
15.
15 グラフ • ありとあらゆるモノをグラフで表せる! • さまざまな分野の問題をグラフに関する問題として 見通よく統一的に扱える!
16.
16 深さ優先探索 • 数独ソルバーを作ることを考える https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC / 99
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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 2 32 2 1 1 / 99
19.
19 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る / 99
20.
20 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む
/ 矛盾したら戻る / 99
21.
21 深さ優先探索の動き 2 32 2 1 1 1 2 32 2 1 1 1 1 2 32 2 1 1 • 矛盾するまで猛突猛進に突き進む
/ 矛盾したら戻る / 99
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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の動き • 矛盾するまで猛突猛進に突き進む /
矛盾したら戻る 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 深さ優先探索の応用 • 数独ソルバー • https://github.com/drken1215/sudoku •
虫食算ソルバーも同様に作れる • コンピュータ将棋 AI の探索ルーチン • makefile などのビルドシステム • 動的計画法 (後述) にもつながる • ネットワークの輸送経路の確保 http://www.dis.uniroma1.it/challenge9/download.shtml
42.
深さ優先探索のポイント • 「目の付け所」がとても大事! • 探索順序を工夫したり…探索不要なところを見出したり •
数独なら、選択肢が少なそうなマスから順に考えるなど
43.
スケジューリング案件などでも • どの従業員をどのシフトに割り当てるか? →
探索 • 自由度の小さいところから先に割り当てるなど • Nuopt の node selection • 他に「とりあえず割り当ててみてひたすら改良」という アプローチも有効
44.
Yes / No
チャート • FAQ やトラブルシューティング • 刑法適用ロジックなども https://www.digitalbook-meclib.jp/tips/detail/yesno-chart/ Yes / No の視点の順序 を工夫することでより コンパクトな表現 Decision Diagram 突き詰めると… 44 / 99
45.
Decision Diagram で広がる応用 •
様々なネットワークの解析や最適設計 • 電力解析網 • 鉄道経路探索 • 割当問題 • 選挙区割当 • 住民のフロアプランの列挙 • テキストマイニングへの応用も • 頻出ワードマイニング • 文字列集合の表現 45 https://www.youtube.com/watch?feature= player_embedded&v=Q4gTV4r0zRs / 99
46.
46 様々なアルゴリズム技法 (再掲) • 探索 •
二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
47.
47 幅優先探索 • 迷路の最短路を求めよう! • スタート
(S) からゴール (G) への最短経路は? / 99
48.
48 幅優先探索 • 迷路の最短路を求めよう! • スタート
(S) からゴール (G) への最短経路は? これもグラフ! / 99
49.
49 幅優先探索 • まず S
から 1 手で行けるマスに「1」と書く / 99
50.
50 幅優先探索 • 次に「1」から 1
手で行けるマスに「2」と書く / 99
51.
51 幅優先探索 • 「2」から 1
手で行けるマスに「3」と書く / 99
52.
52 幅優先探索 • 「3」から 1
手で行けるマスに「4」と書く / 99
53.
53 幅優先探索 • 「4」から 1
手で行けるマスに「5」と書く / 99
54.
54 幅優先探索 • 「5」から 1
手で行けるマスに「6」と書く / 99
55.
55 幅優先探索 • 「6」から 1
手で行けるマスに「7」と書く / 99
56.
56 幅優先探索 • 「7」から 1
手で行けるマスに「8」と書く / 99
57.
57 幅優先探索 • 「8」から 1
手で行けるマスに「9」と書く / 99
58.
58 幅優先探索 • 「9」から 1
手で行けるマスに「10」と書く / 99
59.
59 幅優先探索 • 「10」から 1
手で行けるマスに「11」と書く / 99
60.
60 幅優先探索 • 「11」から 1
手で行けるマスに「12」と書く / 99
61.
61 幅優先探索 • 「12」から 1
手で行けるマスに「13」と書く / 99
62.
62 幅優先探索 • 「13」から 1
手で行けるマスに「14」と書く / 99
63.
63 幅優先探索 • 「14」から 1
手で行けるマスに「15」と書く / 99
64.
64 幅優先探索 • 「15」から 1
手で行けるマスに「16」と書く • これでゴール!!! / 99
65.
65 幅優先探索 • ゴールから、「数値が 1
ずつ下がっていくように」 遡っていくと、最短経路が得られる / 99
66.
66 幅優先探索の応用 • カーナビ • 電車の乗り換え案内 •
パズル (15-パズルなど) の最小手数 https://www.amazon.co.jp/dp/B071J2XFS6
67.
67 最短経路問題 - 実応用に向けて •
道路の長さも考慮 • ダイクストラ法などより高度なアルゴリズムへ • 道路の交通状況も考慮 • 「ここを通ると嬉しい」というボーナスも • ベルマンフォード法などより高度なアルゴリズムへ • 街の構造なども利用して高速化したり
68.
68 様々なアルゴリズム技法 (再掲) • 探索 •
二分探索 (例: 年齢当てゲーム) • 深さ優先探索 (例: 数独ソルバー) • 幅優先探索 (例: 迷路の最短路) • 動的計画法 (例: 編集距離) • グラフ / 99
69.
69 二分探索 A さんの年齢を当てたいとします A さんが
20 歳以上 28 歳未満であることはわかっている Yes / No で答えられる質問を 3 回まで行える A さんの年齢を当てることは可能か? 私は何歳でしょう? 20, 21, 22, 23, 24, 25, 26, 27 のいずれかです / 99
70.
70 効率悪い方法 (線形探索) 私は何歳でしょう? 20, 21,
22, 23, 24, 25, 26, 27 のいずれかです • 20 歳ですか? • 21 歳ですか? • 22 歳ですか? • … • 27 歳ですか? ・Yes になるまで順に聞く ・最悪 7 回聞く必要がある / 99
71.
71 効率良く絞る方法 (二分探索) • 24
歳未満ですか? ][ 20 21 22 23 24 25 26 27 24 未満? / 99
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 効率良く絞る方法 (二分探索) 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.
効率良く絞る方法 (二分探索) 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 二分探索の応用 • データベース中の目的のキーの検索 (古典的) •
プログラムのバグ発生箇所の特定 • スケジューリングへの応用も! • 従業員の労働時間を平準化したい • 最も働いている従業員の労働時間を最小にする • その他、プログラムの効率化に寄与するケース多数!! • 「実は二分探索で効率化できる場面」は非常に多い / 99
76.
76 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 •
まとめ / 99
77.
77 計算量オーダー • 一般に、同じ問題を解くアルゴリズムはいくつも 考えられる • アルゴリズムによって、計算実行時間にとてつも ない差が生じる •
計算量オーダーを学ぶと、考案したアルゴリズムを 実装することなく、予め計算実行時間を大雑把に見 積もれるようになる / 99
78.
78 アルゴリズムによる効率差 A さんが 20
歳以上 28 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:7 回 (順に聞いていく方法) • 二分探索法:3 回 (半減していく方法) / 99
79.
79 アルゴリズムによる効率差 A さんが 0
歳以上 65536 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:65535 回 (順に聞いていく方法) • 二分探索法:16 回 (半減していく方法) / 99
80.
80 アルゴリズムによる効率差 A さんが 0
歳以上 65536 歳未満であることがわかっている Yes / No で答えられる質問をしていく できるだけ少ない回数で A さんの年齢を当てたい 年齢当てゲーム (再掲) • 線形探索法:65535 回 (順に聞いていく方法) • 二分探索法:16 回 (半減していく方法) 問題の規模が大きくなると、とてつもない差になる!! / 99
81.
81 世の中の問題の規模感 この辺りから、単純なアルゴリズムでは間に合わない / 99
82.
82 よくある誤ったイメージ • プログラムは、10 倍のサイズのデータを扱うと、 所要時間はかならず
10 倍になる / 99
83.
83 よくある誤ったイメージ • プログラムは、10 倍のサイズのデータを扱うと、 所要時間はかならず
10 倍になる • プログラムは、10 倍のサイズのデータを扱うと、 所要時間も 10 倍になることもある (割と高速!) • 100 倍になることもある • 1000 倍になることもある • 2~3 倍で済むこともある (超高速) / 99
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 問題例 空のデータベースにデータを順に挿入したい。 最後に挿入されたものが先頭に来るようにしたい。 ex: 鈴木君, 渡辺君,
青木君 (青木君, 渡辺君, 鈴木君) / 99
86.
86 問題例 方法 1 方法
2 リストの先頭に挿入していく リストの末尾に挿入していく 最後に reverse する (ここでは Python を使用) (青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転 ex: 鈴木君, 渡辺君, 青木君 (青木君, 渡辺君, 鈴木君)
87.
87 問題例 方法 1 方法
2 リストの先頭に挿入していく リストの末尾に挿入していく 最後に reverse する (ここでは Python を使用) (青木君, 渡辺君, 鈴木君) (鈴木君, 渡辺君, 青木君) を反転 ex: 鈴木君, 渡辺君, 青木君 (青木君, 渡辺君, 鈴木君)
88.
88 と
の圧倒的な差O(N) O(N2 ) MacBook Air (13-inch, Early 2015) プロセッサ: 1.6 GHz Intel Core i5 / 99
89.
89 と
の圧倒的な差O(N) O(N2 ) MacBook Air (13-inch, Early 2015) プロセッサ: 1.6 GHz Intel Core i5 100 倍 / 99
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 個人的な高速化事例 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 / 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 / 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 / 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 速度改善のための設計技法 (一例) 問題 なんらかの解法 深さ優先探索など などO(N2 ) 動的計画法など O(N log
N) など 二分探索法や、 各種データ構造など / 99
96.
96 計算量オーダーのまとめ • 問題のサイズ
に応じて、どのくらいの計算時間を 要するのかを見積もる「ものさし」 N • 計算量オーダーを考えることで、アルゴリズムの計算 時間を大雑把に見積もることができる • どのアルゴリズムを使おうか、考える際の比較検討に も役立つ / 99
97.
97 本日の講演内容 • アルゴリズムの設計技法の紹介 • アルゴリズムの速度性能向上に関する話 •
まとめ / 99
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 アルゴリズムを学ぶ意義 (まとめ) • 時代や流行の変化にとらわれず、様々な分野の問題を 解決する
(AI を学ぶ上での強力な下地にもなる) • 世の中に溢れるライブラリなどの速度性能向上の勘所を つかんだり、より上手に応用したりできるようになる • 論理的思考力が磨かれ、明快なロジックを考えられる ようになる • 純粋に楽しい! / 99