本スライドでは、有名なアルゴリズムを概観し、アルゴリズムに興味を持っていただくことを目標にします。
第 1 部:アルゴリズムとは 第 2 部:学年を当ててみよう 第 3 部:代表的なアルゴリズム問題 第 4 部:コンピュータとアルゴリズム
50分で学ぶアルゴリズムAlgorithms in 50 minutes東京大学 1 年 E869120最終更新:2021 年 12 月 1 日
View Slide
自己紹介E869120 主な経歴について• 2002年生まれ• 2021年東京大学理科一類入学• AtCoder 赤 (max. 2950)• 国際情報オリンピック (IOI) ‘18, ’19, ’20 金メダル2最近の活動• 「競プロ典型90問」作者• 競プロの作問 (ARC117/ARC119)• Qiita にアルゴリズム関連記事を投稿 (1.7万 Contribution)• ?????
• アルゴリズムを学ぶと、いろいろな問題を(特にプログラミングを用いて)解決するための手段を身に付けることができます。• 本スライドでは、有名なアルゴリズムを概観し、アルゴリズムに興味を持っていただくことを目標にします。難しい数式などを使わないため、中学生レベルの数学的知識があれば理解できる構成となっています。はじめに3注意事項本スライドは、50 分程度の分量にまとめるため、具体的なアルゴリズムの説明が省略されている箇所も多いです。より深く知りたい人は、スライドの最後に記されている「参考文献」やインターネットなどで調べてみてください。
本スライドの構成4第 1 部 アルゴリズムとは第 2 部 学年を当ててみよう第 3 部 代表的なアルゴリズム問題第 4 部 コンピュータとアルゴリズムスライドの最初に、アルゴリズムとは一体どういうものなのかについて解説します。アルゴリズムを使った身近な問題の例として、学年を当てるゲームを紹介します。線形探索法と二分探索法のアイデアを学びます。より良いアルゴリズムを設計すると解ける問題はたくさんあります。第 3 部では身近な問題を6 つピックアップし、アルゴリズムへの興味を持っていただくことを目標にします。最後に、計算の速いコンピュータでもより良いアルゴリズムが求められる理由と、アルゴリズムを学ぶ意義について記します。
第 1 部アルゴリズムとは
• アルゴリズムとは、問題を解く手順のことを指します。• アルゴリズムには良し悪しがあり、素早く問題を解ける方が良いとされることが多いです。• たとえば以下の問題を考えてみましょう。6アルゴリズムとは問題1 から 100 までの整数をすべて足した値を計算してください。
• 単純な方法として、1 つずつ足していくことが考えられます。• 小学校 3 年生で習う足し算のみを使っていますが、アルゴリズムは「問題を解く手順」なので、これもれっきとしたアルゴリズムです。• しかし、99 回の足し算を行う必要があり、面倒です。(効率の悪いアルゴリズム)7アルゴリズムとは13610152128364555++++++++++234567891011==========361015212836455566667891105120136153171190210++++++++++12131415161718192021==========7891105120136153171190210231231253276300325351378406435465++++++++++22232425262728293031==========253276300325351378406435465496496528561595630666703741780820++++++++++32333435363738394041==========528561595630666703741780820861861903946990103510811128117612251275++++++++++42434445464748495051==========9039469901035108111281176122512751326418642784371446545604656475348514950+++++++++9293949596979899100=========427843714465456046564753485149505050…
• そこで、1 から 100 までの整数は「1+100」「2+99」「3+98」といったように、和が101 となる 50 個のペアに分割することができます。• 答えは 101 × 50 = 5050 です。• たったの 1 回で計算できました。(効率の良いアルゴリズム)8アルゴリズムとは1 2 3 499 1001 1002 995150…985 6 7 8…101 × 50= 5050… 和が 101… 和が 101… 和が 101
• このように、アルゴリズムを変えてみるだけで、大幅に効率が良くなることがあります。• 今回の場合は 99 回対 1 回ですが、1 から 1000 までの整数をすべて足す問題では 999回対 1 回となり、さらに差が広がります。9アルゴリズムとは13610152128364555++++++++++234567891011==========3610152128364555666678911051201361531714950+++++++++1213141516171819:100=========78911051201361531711905050アルゴリズム 1 アルゴリズム 2101 × 50 = 5050計算回数99回計算回数1回
• アルゴリズムは、問題を解くための手順のことです。• 少しアルゴリズムを変更するだけで、問題を解くのにかかる時間が大幅に短縮されることがあります。• 第 2 部・第 3 部では、アルゴリズムが使える身近な問題の例を紹介します。10第 1 部のまとめ
学年を当ててみよう第 2 部
• アルゴリズムは、実はとても身近にあるものです。• 例として、以下の問題を考えてみましょう。12学年当てゲームを解こう問題(学年当てゲーム)サクラさんは、大学 1 年・2 年・3 年・4 年のいずれかです。Yes/No で答えられる質問を何回か行うことで、彼女の学年を特定してください。ただし、失礼のないようにするため、質問回数は少ない方が良いです。
• 単純な方法として、「1 年生ですか?」「2 年生ですか?」のように順番に質問していくことが考えられます。• このような方法を線形探索法といいます。• しかし、もし 4 年生だった場合は 4 回の質問を必要とし、やや失礼です。13学年当てゲーム:単純な方法1 年生ですか?2 年生ですか?3 年生ですか?4 年生ですか?1 年生 2 年生 3 年生 4 年生Yes Yes Yes YesNo No No
• そこで、最初に「2 年生以下ですか?」という質問をすることを考えます。• 真ん中で区切る質問をするというアイデアです。14学年当てゲーム:改良した方法1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生YesNo2 年生以下ですか?
• Yes だった場合は「1 年生以下ですか?」という質問をすると 1 回で当てられます。• No だった場合は「3 年生以下ですか?」という質問をすると 1 回で当てられます。• 合計質問回数は 2 回です。なお、このようなアルゴリズムは二分探索法といいます。15学年当てゲーム:改良した方法1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生1年生2年生3年生4年生YesNoYesNoYesNo
• 次に、ルールを少し変えた学年当てゲームを考えましょう。• 選択肢が 4 つから 8 つに増えました。16学年当てゲームの拡張問題(学年当てゲーム)リエさんは、小学校 1 年から中学校 2 年までのいずれかです(それぞれ 1 年生、2 年生、…、8 年生とします)Yes/No で答えられる質問を何回か行うことで、彼女の学年を特定してください。
• これも単純な方法として 1 つずつ調べることが考えられます• しかし、8 年生の場合は 8 回の質問が必要です。• このままではリエさんに失礼です。17学年当てゲームの拡張:単純な方法1年生か?1 年生YesNo 2年生か?3年生か?4年生か?5年生か?6年生か?7年生か?8年生か?2 年生Yes3 年生Yes4 年生 5 年生 6 年生 7 年生 8 年生Yes Yes Yes Yes YesNo No No No No No
• そこで、いま考えられる選択肢の真ん中で区切る質問をすることを考えましょう。• そうすると、1 回の質問で選択肢が8 → 4 → 2 → 1 と半分ずつに減ります。• 質問回数は 3 回です。18学年当てゲームの拡張:改良した方法1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生4 年生以下か?
• そこで、いま考えられる選択肢の真ん中で区切る質問をすることを考えましょう。• そうすると、1 回の質問で選択肢が8 → 4 → 2 → 1 と半分ずつに減ります。• 質問回数は 3 回です。19学年当てゲームの拡張:改良した方法1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生4 年生以下か?6 年生以下か?
• そこで、いま考えられる選択肢の真ん中で区切る質問をすることを考えましょう。• そうすると、1 回の質問で選択肢が8 → 4 → 2 → 1 と半分ずつに減ります。• 質問回数は 3 回です。20学年当てゲームの拡張:改良した方法1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生4 年生以下か?6 年生以下か?5 年生以下か?
• そこで、いま考えられる選択肢の真ん中で区切る質問をすることを考えましょう。• そうすると、1 回の質問で選択肢が8 → 4 → 2 → 1 と半分ずつに減ります。• 質問回数は 3 回です。21学年当てゲームの拡張:改良した方法1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生1年生 2年生 3年生 4年生 5年生 6年生 7年生 8年生4 年生以下か?6 年生以下か?5 年生以下か?
• 学年当てゲームでは、以下の 2 つのアルゴリズムを紹介しました。• 線形探索法:「1 年生ですか?」「2 年生ですか?」と 1 つずつ聞いていく• 二分探索法:いま考えられる選択肢の真ん中で区切る質問を繰り返す• この 2 つの方法は、質問回数(最悪ケース)が大幅に異なります。• 選択肢が 4 つのとき:4 回 vs. 2 回• 選択肢が 8 つのとき:8 回 vs. 3 回22第 2 部のまとめ(1/2)
• このアイデアは、辞書で単語を探すときにも使うことができます。• たとえば a → aardbark → abacus → … と 1 つずつ調べると時間がかかります。• そこで「真ん中を見て、それより前か後かを調べること」を繰り返すと、目的の単語を効率よく探すことができます。400 ページの辞書の場合、最初は200 ページ目と比べれば良いです。23第 2 部のまとめ(2/2)
代表的なアルゴリズム問題第 3 部
25第 3 部の内容について• 第 3 部では、アルゴリズムが使える 6 つの代表的な問題を紹介します。• 問題はすべて生活と関わるものになっています。どれか 1 つでも興味を持っていただけると、大変嬉しく思います。• スライド枚数の都合上、詳しいアルゴリズムの説明は省略しています。興味のある人は、本スライド最後に掲載している参考文献をご覧ください。
• 単純な方法として、以下が考えられます。a. 一番大きい値を探す。b. a. 以外で一番大きい値を探す。c. a./b. 以外で一番大きい値を探す。d. 以下同様。26問題例 (1):ソートいくつかの値を指定された順序でソート(整列)する方法を考えてください。たとえば、期末試験の成績が与えられたとき、高い順に並び替えてみてください。氏名 点数佐藤 83田中 100中村 1渡辺 55氏名 点数田中 100佐藤 83渡辺 55中村 1• このアルゴリズムは選択ソートといいますが、クイックソートやマージソートを使うと、さらに効率よく解けます。
• この問題を解く方法として、ダイクストラ法などが知られています。• 迷路のようにすべての長さ(110kmなどの値)が同じ場合、幅優先探索などが適しています。27問題例 (2):最短経路問題以下のような地図が与えられるので、2 つの都市間の最短距離を求めてください。また、どのように移動すれば最短距離になるかを求めてください。東京大阪 名古屋仙台長野300km150km250km130km110km220km
• 実は、「いま見れる映画の中で上映終了時刻が一番早いものを選ぶ」という方針で選ぶと、最適であることが知られています。• このように、次の手(この場合は次の映画)だけを考えて答えを出すアルゴリズムを貪欲法といいます。28問題例 (3):区間スケジューリング問題今日はいくつかの映画が上映されます。最大で何本の映画を見れるか、そしてそれを実現する方法を求めてください。ただし、同時に 2 つ以上の映画を見ることはできないものとします。0 5 10映画 1映画 2映画 4映画 3映画 5映画 6
• 品物の数が少ない場合、すべての選び方を調べること(全探索)が自然です。• そうでない場合は、動的計画法(漸化式を立てて問題を解く方法)を使うと効率的です。29問題例 (4):ナップザック問題コンビニにはいくつかの品物が売られています。500 円以内の買い物で、最大何 kcal を摂取することができますか。120円217kcal180円368kcal320円661kcal400円107kcal230円436kcal動的計画法のイメージ(興味のある人は参考文献を参照)
• 人間には簡単(直感的に解ける問題)ですが、プログラムを書いてコンピュータに解かせるのは難しいタイプの問題です。• たとえば k-means 法などのアルゴリズムが知られています。30問題例 (5):クラスタリングいくつかのデータが与えられるので、これを適切にグループ分けしてください。たとえば、以下のような家の分布が与えられるとき、できるだけ自然になるように 3 つの地区に分割してください。
• 「2 は素数か?」「3 は素数か?」と 1つずつ調べると、少し時間がかかってしまいます。• 以下のアルゴリズムを使うと、効率よく問題が解けます。エラトステネスのふるいと呼ばれています。• 2 以外の 2 の倍数を消す。• 3 以外の 3 の倍数を消す。• 5 以外の 5 の倍数を消す。• 7 以外の 7 の倍数を消す。(以下略)31問題例 (6):素数の列挙ある一定(たとえば 50)以下の素数を列挙してください。ただし、素数は 1 と自分自身以外で割り切れない数のことを指します。2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 4041 42 43 44 45 46 47 48 49 50
32第 3 部のまとめ• 第 3 部では、以下の 6 つの代表的な問題を紹介しました。詳しくは、参考文献で調べてみてください。• なお、その他にもいろいろな有名問題があります。• 編集距離、最小全域木問題、最大フロー問題、最大マッチング問題、線形計画問題、最近点対問題、素数判定、最大公約数の計算、多倍長整数の計算、etc…• ソート• 最短経路問題• 区間スケジューリング問題• ナップザック問題• クラスタリング• 素数の列挙
コンピュータとアルゴリズム第 4 部
34アルゴリズムは役に立つのか?Q. 計算が速いコンピュータがあってもアルゴリズムの改善は必要か?
• コンピュータは、どんなに大量の計算でも一瞬でこなすイメージがあるかもしれません。• しかし、コンピュータにも限界があり、標準的な家庭用 PC の場合は、素直なプログラムだと 1 秒に約 10 億回しか四則演算を行うことができません。家庭用 PC を使っても無理な例として、以下の問題を考えましょう。35コンピュータとアルゴリズム問題(第 3 部の 4 問目)以下の 60 個の商品がコンビニに売られています。500 円以内で最大何 kcal 得られますか?商品1 商品2 商品3 … 商品60値段 110円 180円 230円 … 90円カロリー 217kcal 368kcal 436kcal … 195kcal
• 単純な解法として、全部の選び方を試す方法(全探索)が考えられます。• しかし、商品の数が 1 個増えると、調べるべきパターンの数が 2 倍になります。36コンピュータとアルゴリズム商品 1 個品物 1 品物 12 通り
• 単純な解法として、全部の選び方を試す方法(全探索)が考えられます。• しかし、商品の数が 1 個増えると、調べるべきパターンの数が 2 倍になります。37コンピュータとアルゴリズム商品 1 個 商品 2 個品物 1 品物 1品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 22 通り 4 通り
• 単純な解法として、全部の選び方を試す方法(全探索)が考えられます。• しかし、商品の数が 1 個増えると、調べるべきパターンの数が 2 倍になります。38コンピュータとアルゴリズム商品 1 個 商品 2 個 商品 3 個品物 1 品物 1品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 3品物 3品物 3品物 3品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 1 品物 2品物 3品物 3品物 3品物 32 通り 4 通り 8 通り
• そして商品が 60 個となると、260 通り(約115 京通り)を調べることになります。• 人間はもちろん、家庭用 PC でも全部調べるのは難しいです。• このような問題を解くためには、より良いアルゴリズムを思いつく必要があります。(例えば今回の場合は動的計画法が使えます)39コンピュータとアルゴリズム21 =22 =23 =24 =25 =26 =27 =:230 =:260 =248163264128:1,073,741,824:1,152,921,504,606,846,976
40アルゴリズムを学ぶ意義では、アルゴリズムを学ぶとどんなことが起こるのでしょうか。
41アルゴリズムを学ぶ意義1 点目 2 点目 3 点目解法の選択肢が広がる 計算量の感覚が身につく 論理的思考力が身につくO(log N)O(N)O(N2)O(2N)
42アルゴリズムを学ぶ意義1 点目 2 点目 3 点目解法の選択肢が広がる 計算量の感覚が身につく 論理的思考力が身につくO(log N)O(N)O(N2)O(2N)• 世の中の多くの問題は、いくつかの「典型的なアルゴリズム」を応用することで解けます。• したがって、アルゴリズム学習により、プログラミングを用いた問題解決が得意になるでしょう。
43アルゴリズムを学ぶ意義1 点目 2 点目 3 点目解法の選択肢が広がる 計算量の感覚が身につく 論理的思考力が身につくO(log N)O(N)O(N2)O(2N)• アルゴリズムを知ると、どこかで「計算量」を学びます。• 計算量を知ると実行時間の感覚が身につくため、実行が終わらないプログラムを書く失敗が減ります。
44アルゴリズムを学ぶ意義1 点目 2 点目 3 点目解法の選択肢が広がる 計算量の感覚が身につく 論理的思考力が身につくO(log N)O(N)O(N2)O(2N)• アルゴリズムを勉強すると、複雑なものをシンプルに整理する能力が身につきます。• そのため、以下のような副次的効果も期待できます。• プログラムを書く速度が上がる。• 物事の原因を突き止める力が上がる。• 数学の問題が解けるようになる。
• アルゴリズムを学ぶ方法はさまざまですが、実践的に学びたい場合は問題を解くことをおすすめします。• アルゴリズムの問題を無料で解けるサービスとして、AtCoder やアルゴ式などが有名です。• 競争が好きな人は、競技プログラミングに参加しても良いかもしれません。45アルゴリズムを学ぶ方法https://atcoder.jp/https://algo-method.com/
スライドのまとめ
• アルゴリズムは「問題を解く手順」のことです。• アルゴリズムによって、問題を解く効率が大きく異なる場合があります。• 第 2 部では「学年当てゲーム」を紹介しました。• 線形探索法と二分探索法で、質問回数が大幅に異なることを解説しました。• アルゴリズムが使える問題は、ほかにもたくさんあります。• 第 3 部では、ソート・最短経路問題・区間スケジューリング問題・ナップザック問題・クラスタリング・素数の列挙の 6 つを取り上げました。• ほかにも多数の有名問題があります。参考文献などで調べてみてください。4750 分のまとめ(1/2)
• コンピュータであっても、どんなに大量の計算処理を一瞬で行えるとは限りません。• したがって、さまざまなアルゴリズムを知り、より少ない計算処理で問題を解決するスキルを身に付けることが大切です。• 皆さんも、たのしいアルゴリズムの世界に入っていきましょう。4850 分のまとめ(2/2)
1. T.コルメン、R.リベスト、C.シュタイン、C.ライザーソン:「アルゴリズムイントロダクション 第3版総合版」、近代科学社(2013)2. 大槻兼資:「問題解決力を鍛える!アルゴリズムとデータ構造」、講談社(2020)3. 渡部有隆:「プログラミングコンテスト攻略のための アルゴリズムとデータ構造」、マイナビ出版(2015)4. 石田保輝、宮崎修一:「アルゴリズム図鑑 絵で見てわかる 26 のアルゴリズム」、翔泳社(2017)5. 梅谷俊治:「60分で学ぶ数理最適化」(https://speakerdeck.com/umepon/mathematical-optimization-in-60-minutes)6. AtCoder(https://atcoder.jp/)7. 実生活に学ぶアルゴリズム【第1回:セブンイレブンでは 500 円で何カロリー得られるか?】(https://qiita.com/e869120/items/5d9d0fcbb6dc7dbf87f9)8. いらすとやの画像を利用49参考文献