アルゴリズムと計算量

[教科書6.1.1]

同じ処理結果が求まるプログラムはいろいろあり得るが、本質的に違うなやり方としてどのようなものがあるのか、とそれらの計算の大変さの違いを知りたい。 そこでプログラムを抽象化してアルゴリズムというものを考える。

アルゴリズムの重要性

一見簡単そうに見えて大変な問題の例

ハノイの塔シミュレーターで試してみよ。

ルール

アルゴリズムの例: 平方根

アルゴリズムの実例として平方根を計算するアルゴリズムを3種類示す。 [教科書6.1.2]

問題: 与えられたの平方根を求める。

コンピュータの制限: 小数の計算は有限の精度で行われるので、近似値しか求められない。(小数点のある数の表現)

問題を具体化したもの: ある正の実数xが与えられた時に、2乗するとxに近くなる正の実数yを精度δで求める。 つまり、となるyを一つ求める。

方法による精度と反復回数の違い
反復法 二分法 ニュートン法
精度 0.0001 0.0001 0.0001
結果 1.4142 1.414185 1.414216
反復回数 14142 15 3

計算量

[教科書6.1.4]

計算時間の見積りは重要である。

計算時間はプログラムの細かい違いやCPUの違いに影響されるのでそれを求めるのは大変である。 しかし、まずはおおざっぱな見積りが欲しいことが多いので、計算時間を抽象化した「計算量」というものを考える。 計算量の使い方 計算量の見積り方 例:平方根の計算の計算量

計算量の違いによる実行時間の差(1回の計算に1nsかかるとした場合の計算時間)

計算量 n=1 10 100 1000 10000 100000 1000000 10000000
log n - 1ns 2ns 3ns 4ns 5ns 6ns 7ns
n 1ns 10ns 100ns 1μs 10μs 100μs 1ms 10ms
n2 1ns 100ns 10μs 1ms 0.1s 10s 16分 27時間
n3 1ns 1μs 1ms 1s 16分 11日 31年 3000年
2n 2ns 1μs 40兆年 - - - - -

実験データを処理するソフトを買いに行ったらAとBの2つの製品があった。 Aには「O(N2)」、Bには「O(N log2(N))」と書かれている。 試しに1000件のデータを処理させたところ、Aは1秒で終わったが、Bは10秒かかってしまった。 実際に処理するデータは100万件である。 実験結果の発表会は3日後にせまっているので、2日後には計算が終わっていて欲しい。 さて、あなたならどちらの製品を選ぶか?

(nは自然数とする)を計算するアルゴリズムを考え、計算量を導いてみよ。 ここでは、nに対する依存性だけを考え、乗算は1単位の時間で計算できるとする。 次に、nが偶数の場合はと計算できることを使って、 効率的なアルゴリズムを導き、その計算量を見積もれ

データを昇順に並べる操作(ソート,並べ替え)はよく使われる処理であり、それを計算するアルゴリズムもよく研究されている。 ソートを行う4種類のアルゴリズム(単純ソート、クイックソート、マージソート、ヒープソート)の動きを 可視化したものを見ると、アルゴリズムによる速度の違いが分かるだろう。 データが100の場合の可視化と速度の変化を比べてみよ。 ((余談)ソートの計算量の下限)

計算可能性

問題の難しさの概観

yamaguch@mail.ecc.u-tokyo.ac.jp
Copyright 2011 Kazunori Yamaguchi 山口和紀@東京大学総合文化研究科