講義「アルゴリズムとデータ構造」
第2回 アルゴリズムと計算量
大学院情報科学研究院 情報理工学部門 情報知識ネットワーク研究室
喜田拓也
2019/5/21 講義資料
今日の内容
アルゴリズムの計算量とは?
漸近的計算量
オーダーの計算の方法
最悪計算量と平均計算量 ポイント
オーダー記法
ビッグオー ( O ) ,ビッグオメガ ( Ω ) ,ビッグシータ ( Θ )
2
𝑤𝑤3 𝑤𝑤4
𝑤𝑤1
時間
𝑤𝑤2
お風呂スケジューリング問題
お風呂に入る順番を決めよう!
全員の待ち時間と入浴時間の合計を最小にする順番を求める
3
お風呂スケジューリング問題
待ち時間 入浴時間
𝑤𝑤 1 + 3𝑤𝑤 2 + 4𝑤𝑤 3 + 2𝑤𝑤 4
0 𝑤𝑤 3
𝑤𝑤 3 + 𝑤𝑤 2 𝑤𝑤 4
𝑤𝑤 3 𝑤𝑤 2
𝑤𝑤 3 + 𝑤𝑤 2 + 𝑤𝑤 4 𝑤𝑤 1
𝑤𝑤3
𝑤𝑤4 𝑤𝑤2
𝑤𝑤1
4
例えば,こんな順番だと …
もっと小さく できます
𝑤𝑤1
𝑤𝑤3 𝑤𝑤4
時間
𝑤𝑤2
お風呂スケジューリング問題
お風呂に入る順番を決めよう!
複雑な制約が付くと,スケジューリング問題はとても難しい!
お父さんの入った浴槽に浸かりたくない!
私も!
お姉ちゃんよりは後でいいや
5
よいアルゴリズムとは?
性能の指標はいろいろある
計算時間
メモリサイズ(使用メモリ量)
外部記憶への入出力数 ネットワークの通信量
ほかの要素
再利用可能性 (Reusability) 読みやすさ (Readability) 移植しやすさ (Portability) etc...
6
ここでは,計算時間とメモリサイズのみに注目する
計算コスト(計算量)という考え方
7
時間計算量 (time complexity) ⇒ 計算のステップ数 領域計算量 (space complexity) ⇒ 記憶領域量
ある問題を解くために必要な計算量を測りたい・・・でも 計算時間やメモリサイズはいろいろな要素に依存する!
1. アルゴリズムの方式 2. コーディングスタイル
3. 言語の種類とコンパイラの質 4. ハードウェアの性能
5. 入力そのもの
1個の問題に対して入力は様々
8
問題例1 解1
問題例2 解2
1個の問題 = 無限個の問題例の集合
アルゴリズム
最大公約数を求める問題 (GCD) 入力:正整数 𝑎𝑎 0 , 𝑎𝑎 1
出力: 𝑎𝑎 0 と 𝑎𝑎 1 の最大公約数
問題:
問題例: (𝑎𝑎
0, 𝑎𝑎
1) = (28,12) , (987654321, 123456789)
かかる時間は異なる計算量の評価法
9
問題例の規模によって計算量が変わる
⇒問題例の規模に応じた評価
⇒入力長 𝑛𝑛 の関数 𝑇𝑇 (𝑛𝑛) として計算量を評価
ただし,入力長および計算量は計算コストモデルに依存 定数(一様)コストモデル
すべての数を1語(1単位のデータ)とみなして、どの基本命令も 単位時間で実行できると仮定
対数コストモデル
各々の数は,それを表現するのに必要なビット数の語数が必要 であり、基本命令の実行はビット数に応じた時間がかかると仮定
※ 大きな数字を扱うことが本質的な問題は対数コストモデル、そうでない場合は 定数コストモデルで考えることが多い
「オーダー」記法について
ビッグオーダーとか グランドオーダーとか?
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
|| 位数とか次数 。 ∧_∧ いいですね。
|| って意味です \ (゚Д゚,,)
||_________⊂⊂ |
漸近的計算量
11
オーダー評価とは
計算量 𝑇𝑇(𝑛𝑛) は十分大きな 𝑛𝑛 に対して評価する
定数倍の差はないものとみなす
定義[漸近的上界(ビッグオー記法)]
𝑇𝑇(𝑛𝑛) = O(𝑓𝑓(𝑛𝑛)) ⇔ ある実数 𝑐𝑐 > 0 と自然数 𝑛𝑛
0が存在して 全ての 𝑛𝑛 ≥ 𝑛𝑛
0に対して 𝑇𝑇 𝑛𝑛 ≤ 𝑐𝑐 ⋅ 𝑓𝑓(𝑛𝑛) が成り立つ
「 𝑇𝑇(𝑛𝑛) は,オーダー 𝑓𝑓(𝑛𝑛) である」または「 𝑇𝑇(𝑛𝑛) は,ビッグオー 𝑓𝑓(𝑛𝑛) である」と読む
漸近的上界 (asymptotic upper bound) =意味 「関数 𝑇𝑇 ( 𝑛𝑛 ) は 𝑓𝑓 ( 𝑛𝑛 ) と同じか小さい」
漸近的上界はいくらでも存在するができるだけ単純で精度のよいものがよい (1) 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = O(𝑛𝑛
2) ← best!
(2) 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = O(𝑛𝑛
2+ 𝑛𝑛) ← (1) より複雑
(3) 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = O(𝑛𝑛
3) ← (1) より精度が悪い
なぜ計算時間をオーダーで測るのか?
12
オーダーが大きいほど,係数によらず計算時間が急速に増加する 質問: 問題のサイズを大きくしていったらどうなるか?
100𝑛𝑛, 5𝑛𝑛2, 𝑛𝑛3/2, 2𝑛𝑛の計算時間をもつ4つのプログラムに対して,
その入力𝑛𝑛を増やしながら走らせたときの計算時間のグラフ
なぜ計算時間をオーダーで測るのか?
13
質問: 時間をかけた分だけ大きなサイズの問題が解けるか?
O(𝑛𝑛) 時間アルゴリズムなら計算時間を 10 倍にすると 10 倍の サイズの問題が解ける
しかし, O(𝑛𝑛
3) 時間なら 2.3 倍, O(2
𝑛𝑛) 時間なら 1.3 倍しか 大きくならない!
実行時間
𝑇𝑇(𝑛𝑛) 10
3秒で解ける
最大問題サイズ 10
4秒で解ける 最大問題サイズ
増大率
(倍)
100𝑛𝑛 10 100 10.0
5𝑛𝑛
214 45 3.2
𝑛𝑛
3/2 12 27 2.3
2
𝑛𝑛10 13 1.3
漸近的計算量の性質
14
𝑇𝑇
1𝑛𝑛 = O 𝑓𝑓 𝑛𝑛 , 𝑇𝑇
2𝑛𝑛 = O 𝑔𝑔 𝑛𝑛 のとき,次の等式が成立
1. 𝑇𝑇
1(𝑛𝑛) + 𝑇𝑇
2(𝑛𝑛) = O max 𝑓𝑓 𝑛𝑛 , 𝑔𝑔 𝑛𝑛
意味: いくつかの処理を順次行う場合は一番遅い処理が 全体の処理速度を支配する
2. 𝑇𝑇
1𝑛𝑛 𝑇𝑇
2(𝑛𝑛) = O 𝑓𝑓 𝑛𝑛 𝑔𝑔 𝑛𝑛
意味: 処理を繰り返し行うとその回数分時間がかかる
オーダー表記の注意点: (左辺の精度) ≥ (右辺の精度)
証明してみよう!
(例) ○ 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = O 𝑛𝑛
2× O(𝑛𝑛
2) = 2𝑛𝑛
2+ 5𝑛𝑛 + 1000
(例) 𝑛𝑛
2+ 𝑛𝑛
3= O 𝑛𝑛
3, 𝑛𝑛
2・ 𝑛𝑛
3= O 𝑛𝑛
5漸近的下界
15
定義[漸近的下界(ビッグオメガ記法)]
𝑇𝑇(𝑛𝑛) = Ω(𝑓𝑓(𝑛𝑛)) ⇔ ある実数 𝑐𝑐 > 0 と自然数 𝑛𝑛
0が存在して 全ての 𝑛𝑛 ≥ 𝑛𝑛
0に対して 𝑇𝑇 𝑛𝑛 ≥ 𝑐𝑐 ⋅ 𝑓𝑓(𝑛𝑛) が成り立つ
(例) 𝑇𝑇 𝑛𝑛 = 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = Ω 𝑛𝑛
2𝑇𝑇 𝑛𝑛 = �𝑛𝑛
2, if 𝑛𝑛 は奇数
𝑛𝑛
3, if 𝑛𝑛 は偶数 𝑇𝑇(𝑛𝑛) = Ω 𝑛𝑛
2漸近的下界の別定義
𝑇𝑇(𝑛𝑛) = Ω(𝑓𝑓(𝑛𝑛)) ⇔ ある実数 𝑐𝑐 > 0 が存在して,無限個の 𝑛𝑛 に対して
𝑇𝑇 𝑛𝑛 ≥ 𝑐𝑐 ⋅ 𝑓𝑓(𝑛𝑛) が成り立つ
下の定義では Ω 𝑛𝑛
3次の定義を Ω の定義として採用することもある(研究論文ではこちらも多い)
上の定義の方が厳しいので上の定義を満たせば次の定義も満たす
漸近的下界 (asymptotic lower bound)= 意味 「関数 𝑇𝑇(𝑛𝑛) は 𝑓𝑓(𝑛𝑛) と同じか大きい」
「 𝑇𝑇(𝑛𝑛) はビッグオメガ 𝑓𝑓(𝑛𝑛) である」と読む
漸近的にタイトな限界
16
定義[漸近的にタイトな限界( asymptotic tight bound )]
𝑇𝑇(𝑛𝑛) = Θ(𝑓𝑓(𝑛𝑛)) ⇔ ある実数 𝑐𝑐
0, 𝑐𝑐
1> 0 と自然数 𝑛𝑛
0が存在して
全ての 𝑛𝑛 ≥ 𝑛𝑛
0に対して,
𝑐𝑐
0𝑓𝑓 𝑛𝑛 ≤ 𝑇𝑇 𝑛𝑛 ≤ 𝑐𝑐
1𝑓𝑓 𝑛𝑛 が成り立つ
𝑇𝑇(𝑛𝑛) = Θ(𝑓𝑓(𝑛𝑛)) ⇔ 𝑇𝑇(𝑛𝑛) = O(𝑓𝑓(𝑛𝑛)) , 𝑇𝑇(𝑛𝑛) = Ω(𝑓𝑓(𝑛𝑛)) 一般に
Ω の別定義であれば ⇒ のみ成立
「 𝑇𝑇(𝑛𝑛) はビッグシータ 𝑓𝑓(𝑛𝑛) である」と読む
(例) 𝑇𝑇 𝑛𝑛 = 2𝑛𝑛
2+ 5𝑛𝑛 + 1000 = Θ 𝑛𝑛
2𝑇𝑇 𝑛𝑛 = �𝑛𝑛
2, if 𝑛𝑛 は奇数
𝑛𝑛
3, if 𝑛𝑛 は偶数 𝑇𝑇 𝑛𝑛 ≠ Θ 𝑛𝑛
3(上級編)教養として o と ω も知っておこう!
17
定義[漸近的にタイトでない上界]
𝑇𝑇(𝑛𝑛) = o(𝑓𝑓(𝑛𝑛)) ⇔ 任意の実数 𝑐𝑐 > 0 に対し,ある自然数 𝑛𝑛
0が存在して,
全ての 𝑛𝑛 ≥ 𝑛𝑛
0に対して 𝑇𝑇 𝑛𝑛 ≤ 𝑐𝑐 ⋅ 𝑓𝑓 𝑛𝑛 が成り立つ
(例) 2𝑛𝑛 = o 𝑛𝑛
2, 2𝑛𝑛
2≠ o 𝑛𝑛
2「 𝑇𝑇(𝑛𝑛) はスモールオー 𝑓𝑓(𝑛𝑛) である」と読む
𝑇𝑇(𝑛𝑛) は 𝑛𝑛 が無限大に近づくにつれて, 𝑓𝑓(𝑛𝑛) に対して相対的に小さくなる
すなわち,
𝑛𝑛→∞lim
T 𝑛𝑛𝑓𝑓 𝑛𝑛= 0 となる
𝑇𝑇(𝑛𝑛)は𝑓𝑓(𝑛𝑛)より真に小さい定義[漸近的にタイトでない下界]
𝑇𝑇(𝑛𝑛) = 𝜔𝜔(𝑓𝑓(𝑛𝑛)) ⇔ 任意の実数 𝑐𝑐 > 0 に対し,ある自然数 𝑛𝑛
0が存在して,
全ての 𝑛𝑛 ≥ 𝑛𝑛
0に対して 𝑇𝑇 𝑛𝑛 ≥ 𝑐𝑐 ⋅ 𝑓𝑓 𝑛𝑛 が成り立つ
(例) 2𝑛𝑛
2= 𝜔𝜔 𝑛𝑛 , 2𝑛𝑛
2≠ 𝜔𝜔 𝑛𝑛
2「 𝑇𝑇(𝑛𝑛) はスモールオメガ 𝑓𝑓(𝑛𝑛) である」と読む
𝑇𝑇(𝑛𝑛) は 𝑛𝑛 が無限大に近づくにつれて, 𝑓𝑓(𝑛𝑛) に対して相対的に大きくなる
すなわち,
𝑛𝑛→∞lim
T 𝑛𝑛𝑓𝑓 𝑛𝑛= ∞ となる
𝑇𝑇(𝑛𝑛)は𝑓𝑓(𝑛𝑛)より真に大きい𝑇𝑇(𝑛𝑛) = o(𝑓𝑓(𝑥𝑥))⇔ 𝑓𝑓(𝑥𝑥) = 𝜔𝜔(𝑇𝑇(𝑛𝑛))
オーダーの計算の基本
規則1: 𝑇𝑇(𝑛𝑛) が 𝑛𝑛 の多項式ならば,最大次数の項のオーダーになる
(例) 2𝑛𝑛
2+ 3𝑛𝑛 + 100 = O 𝑛𝑛
210𝑛𝑛 + 2 𝑛𝑛 + 5 = 10𝑛𝑛
1+ 2𝑛𝑛
0.5+ 5 = O 𝑛𝑛 規則2: 次のオーダーの式が成立する
log 𝑛𝑛 = O(𝑛𝑛) 𝑛𝑛 = O 2
𝑛𝑛任意の 𝑐𝑐 > 0 に対して, log 𝑛𝑛 = O 𝑛𝑛
𝑐𝑐規則3: 𝑇𝑇(𝑛𝑛) がいくつかの項の和ならば,最大次数の項のオーダーになる
18
(例) 3𝑛𝑛
2+ 2 𝑛𝑛 + 100 log 𝑛𝑛 + 5 = O 𝑛𝑛
2増加のオーダーによる比較 (1)
19
計算時間が 𝑇𝑇
1𝑛𝑛 と 𝑇𝑇
2𝑛𝑛 のアルゴリズムではどちらが速いか?
⇒ 増加のオーダーが小さい方が速い
規則4: 𝑇𝑇
1(𝑛𝑛) よりも 𝑇𝑇
2(𝑛𝑛) の方が増加のオーダーが大きい
⇔
𝑛𝑛→∞lim
𝑇𝑇𝑇𝑇1 𝑛𝑛2 𝑛𝑛
= 0 ⇔
𝑛𝑛→∞lim
𝑇𝑇𝑇𝑇2 𝑛𝑛1 𝑛𝑛
= ∞
規則5: 𝑇𝑇
1(𝑛𝑛) と 𝑇𝑇
2(𝑛𝑛) は増加のオーダーが等しい
⇔ 𝑇𝑇
1𝑛𝑛 = Θ T
2𝑛𝑛 ⇔ 𝑇𝑇
2𝑛𝑛 = Θ 𝑇𝑇
1𝑛𝑛
𝑇𝑇
1(𝑛𝑛) と 𝑇𝑇
2(𝑛𝑛) は増加のオーダーが等しい ⇐
⇏ ある 𝑐𝑐 > 0 が存在し,
𝑛𝑛→∞lim
𝑇𝑇𝑇𝑇1 𝑛𝑛2 𝑛𝑛
= 𝑐𝑐
注意
増加のオーダーによる比較 (2)
20
規則6: ロピタル( de l’Hospital )の法則
1. 𝑓𝑓(𝑥𝑥) と 𝑔𝑔(𝑥𝑥) が微分可能で, 𝑓𝑓(𝑎𝑎) = 𝑔𝑔(𝑎𝑎) = 0 かつ 𝑥𝑥 = 𝑎𝑎 以外で 𝑔𝑔
′𝑥𝑥 ≠ 0 であるなら,
𝑥𝑥→𝑎𝑎lim
𝑔𝑔 𝑥𝑥𝑓𝑓 𝑥𝑥= lim
𝑥𝑥→𝑎𝑎𝑔𝑔𝑓𝑓′′ 𝑥𝑥𝑥𝑥が成り立つ
2. 𝑓𝑓(𝑥𝑥) と 𝑔𝑔(𝑥𝑥) が微分可能で,
𝑥𝑥→∞lim 𝑓𝑓(𝑥𝑥) = lim
𝑥𝑥→∞𝑔𝑔(𝑥𝑥) = ∞ であれば,
𝑥𝑥→∞
lim
𝑓𝑓 𝑥𝑥
𝑔𝑔 𝑥𝑥
= lim
𝑥𝑥→∞𝑓𝑓𝑔𝑔′′ 𝑥𝑥𝑥𝑥が成り立つ
(例) 𝑛𝑛
0.01と log 𝑛𝑛
100ではどちらが漸近的に増加率が大きいか?
𝑛𝑛→∞
lim
log 𝑛𝑛
100𝑛𝑛
0.01= lim
𝑛𝑛→∞100 log 𝑛𝑛
99× 1/𝑛𝑛
0.01𝑛𝑛
−0.99= lim
𝑛𝑛→∞100 log 𝑛𝑛
990.01𝑛𝑛
0.01= lim
𝑛𝑛→∞100 ⋅ 99 log 𝑛𝑛
980.01
2𝑛𝑛
0.01= ⋯ = lim
𝑛𝑛→∞100!
0.01
100𝑛𝑛
0.01= 0
発展問題
21
次のオーダー表記を簡略化せよ (a) O 𝑛𝑛 log 𝑛𝑛 + 𝑛𝑛
2+ O 𝑛𝑛
1.83log 𝑛𝑛
明らかに 𝑛𝑛 log 𝑛𝑛 < 𝑛𝑛
2, 𝑛𝑛 log 𝑛𝑛 < 𝑛𝑛
1.83log 𝑛𝑛 である.また,
𝑛𝑛→∞
lim
𝑛𝑛
1.83log 𝑛𝑛
𝑛𝑛
2= lim
𝑛𝑛→∞log 𝑛𝑛
𝑛𝑛
0.17= lim
𝑛𝑛→∞1/𝑛𝑛
0.17𝑛𝑛
−0.83= lim
𝑛𝑛→∞1
0.17𝑛𝑛
0.17= 0.
よって,十分大きな 𝑛𝑛 に対して 𝑛𝑛
1.83log 𝑛𝑛 < 𝑛𝑛
2であるから O 𝑛𝑛 log 𝑛𝑛 + 𝑛𝑛
2+ O 𝑛𝑛
1.83log 𝑛𝑛 = O 𝑛𝑛
2となる.
(b) O 𝑛𝑛
log 𝑛𝑛+ 𝑛𝑛
100+ 𝑛𝑛
30log 𝑛𝑛
𝑛𝑛
30log 𝑛𝑛 < 𝑛𝑛
100は明らか.
また十分大きな 𝑛𝑛 に対して, 𝑛𝑛
100< 𝑛𝑛
log 𝑛𝑛が成り立つ.よって,
O 𝑛𝑛
log 𝑛𝑛+ 𝑛𝑛
100+ 𝑛𝑛
30log 𝑛𝑛 = O 𝑛𝑛
log 𝑛𝑛となる.
(c) O(𝑛𝑛
3sin
2𝑛𝑛)O(2
𝑛𝑛/ log 𝑛𝑛)
チャレンジ!アルゴリズムの計算量
計算量を問題例の入力長 𝑛𝑛 の関数としてオーダー評価したもの 以下の二つの評価法がある。
(例) 入力長が 𝑛𝑛 の問題例に対し確率 (𝑛𝑛 − 1)/𝑛𝑛 で O 𝑛𝑛 , 確率 1/𝑛𝑛 で O 𝑛𝑛
2であるようなアルゴリズムの計算量
⇒ 最悪時間計算量 O 𝑛𝑛
2平均時間計算量 O 𝑛𝑛
最悪計算量 ( worst case complexity )
入力長が 𝑛𝑛 である問題例の中で最大の計算量 平均計算量 ( average case complexity )
入力長が 𝑛𝑛 である問題例の計算量の期待値
※ 通常は,最悪計算量で評価することが多い
22
𝑤𝑤3 𝑤𝑤4
𝑤𝑤1
時間
𝑤𝑤2
お風呂に入る順番を決めよう!
全員の待ち時間と入浴時間の合計を最小にする順番を求める
23
お風呂スケジューリング問題の計算量は?
𝑛𝑛 人のお風呂スケジューリング問題の 解の空間は 𝑛𝑛! (順列通り)もある!
単純な方法だと O 𝑛𝑛! 時間かかるが …
他に制約がない場合,うまくやれば O 𝑛𝑛 log 𝑛𝑛 時間
で解ける!
今日のまとめ
アルゴリズムの計算量とは?
時間計算量と領域計算量
入力長 𝑛𝑛 の関数 𝑇𝑇 ( 𝑛𝑛 )として計算量を評価
オーダー記法
漸近的計算量(十分大きな 𝑛𝑛 で.定数倍は無視)
ビッグオー( O ),ビッグオメガ( Ω ),ビッグシータ( Θ ),
スモールオー( o ),スモールオメガ( 𝜔𝜔 ) オーダーの比較の仕方,簡略化の方法
最悪計算量と平均計算量
24