フローチャート(2)«–/2...合計処理 (配列を使う)...

38
フローチャート(2) アルゴリズム論 2回講義 2011107(金)

Upload: dokiet

Post on 04-Apr-2019

218 views

Category:

Documents


0 download

TRANSCRIPT

フローチャート(2)

アルゴリズム論 第2回講義

2011年10月7日(金)

反復構造 (一定回数のループ処理)

100回同じ処理を繰り返す お風呂で子供が指をおって 数を数える感じ 繰り返し数を記憶する変数 をカウンター(変数名Iをよく 使う)と呼ぶ カウンターを初期化して, 100回繰り返したかどうか判定して そうならば終了 そうでなければ処理を実行して カウントアップ(インクリメント)して ~に戻って同様の処理を続ける

START

END

反復処理

i=0

i=i+1

i = or >100 yes

no

前処理

終了条件判定

後処理

合計処理 (配列を使う)

前提:N個のデータが予め配列arrayに格納.(Nは既知)

目標:その個の数値データの合計値をsumに求める

54

20

88

31

配列array

変数sum

54+20+88+…+31

前処理→何を初期化? i=0, sum=0 反復処理? →配列要素の添え字を利用 sum=sum+array(i) 終了条件は? 後処理→何を出力?

合計処理(配列)フローチャート

START

END

sum=sum+array(i)

i=0,sum=0

i=i+1

i ≧ N yes

no

前処理

後処理

カウント処理 (配列を使う)

前提:N個のデータが予め配列arrayに格納(Nは不明).

末尾にデータ終了を表すためにー1が格納.

目標:データの個数を変数countに求める

54

20

88

31

配列array

変数count

前処理→何を初期化? 反復処理? →配列要素の添え字を利用 終了条件は? 後処理→何を出力?

-1 データ末尾

データ個数

カウント処理(配列)フローチャート

平均値算出 合計値÷データ個数→平均値

○合計値を求めるアルゴリズムとデータ個数を求めるアルゴリズムを組み合わせれば,平均値を求めるアルゴリズムが作成できるはず

前提:N個のデータが予め配列arrayに格納(Nは不明).

末尾にデータ終了を表すためにー1が格納.

目標:所与データ群の平均値を変数aveに求める

54

20

88

31

配列array

-1

平均値

変数ave

データ末尾

前処理→何を初期化? 反復処理? →配列要素の添え字を利用 終了条件は? 後処理→例外処理が必要

平均値算出フローチャート

最大値選出

54

20

88

a b c

3つの変数,a,b,c に格納されている値から最大値を選ぶには? aとbを比較して, aが大きければ→ ? bが大きければ→ ?

データが多くなると上記処理では対応できない. よって配列を利用して反復構造を適用する.

54

20

88

31

暫定最大値 暫定最大値

前提:N個のデータが予め配列arrayに格納(Nは既知). 目標:所与データ群からの最大値を変数maxに求める

N

個のデ|タ

配列array

最大値選出フローチャート

最小値選出

54

20

88

a b c

3つの変数,a,b,c に格納されている値から最小値を選ぶには? aとbを比較して, aが小さければ→ ? bが小さければ→ ?

データが多くなると上記処理では対応できない. よって配列を利用して反復構造を適用する.

54

20

88

31

暫定最小値 暫定最小値

前提:N個のデータが予め配列arrayに格納(Nは既知). 目標:所与データ群からの最小値を変数minに求める ※最大値選出と同様にできるが,99999がarray配列 要素より必ず大きいと仮定し,i=0と初期化して フローチャートを作成せよ.

N

個のデ|タ

配列array

最小値選出フローチャート

開始

-1→max

101→min

YES

cnt≧10

YES

ten > max

平均点(=sum÷10)を表示

YES

ten < min

最高点(max)・最低点(min)を表示

cnt + 1 → cnt

終了

0→sum

0→cnt

tenを入力

a

b

ten → min NO

NO

NO

問題1: 10人分の点数を入力し,平均点,最高点,最低点を求める流れ図を示す. aと b を埋めよ

開始

dataを入力

YES

cnt≧6

最高点(max)を表示

最低点(min)を表示

data→max

data→min

1→cnt

dataを入力

data:max

data:min

data→max

cnt +1→cnt

data→min

α

終了

< ≧

問題2 入力データ:63, 82, 35, 92, 71, 32 流れ図のαは何回実行されるか?

単純ソート

①バブルソート

②選択ソート

③挿入ソート

ソート(並替え,整列) アルゴリズム

ランダムに並んでいるデータを

値の小さい順(昇順),

大きい順(降順)に並べ替えること

学生を学籍番号順,

都市を人口の多い順,

...

コンピュータはTunnel Vision

トンネル視(棒視,視野狭窄症)

• 人間:一度に全体を見渡して判断できる

• コンピュータ:そんなグローバルな処理は (一度には)できない. ⇒2つのデータの大小比較しかできない ⇒アセンブリ言語命令は,一項演算か二項演算 ⇒局所的な処理を積み重ねてグローバルな 処理を実現する ⇒この実現方法を考えることが, アルゴリズムを考えるということ

単純ソートの2つの基本処理

①2つのデータの大小比較

②(逆順なら)2つのデータを交換

バブルソートのアルゴリズム

列の左端から始めて

① 隣接する2つのデータを比較.

② 左>右ならば入れ替え.左<右ならそのまま.

③ 右へ一つ移動して②を実行.

④ ソート済のデータに到達したら③を停止し,

左端に戻る.

4要素のバブルソート

×

a(0)

×

a(1)

a(2)

a(3)

a(0)

×

a(1)

×

a(2)

a(3)

a(0)

a(1)

×

a(2)

×

a(3)

a(0)

1

a(1)

3

a(2)

4

a(3)

バブルソートにおける

2種類のループ処理

整列前 20 6 55 74 3 45 13 87 46 30

内部ループ(Inner Loop) : 反復操作⇒2項比較

比較範囲はインクリメンタル

外部ループ(Outer Loop):

反復操作⇒最大値を右端に追いやる

スキャン(走査)範囲はデクリメンタル

87

74 87

6 20 3 45 13 74 46 30

隣接2データ比較・交換

データ交換

65 23

a(2) a(3)

a(2)の方がa(3)より大きいからデータを交換する

a(2)=a(3)

a(3)=a(2)

とするとOKかな?

だめ.バッファー(一時記憶)を使う

b=a(2)

a(2)=a(3)

a(3)=b

i>=n-1

a(i)>a(i+1)

b=a(i)

a(i)=a(i+1)

a(i+1)=b

n--

i++

前処理(初期化)

外部ループ

内部ループ

隣接データ交換処理

大きい値がバッファを

通して一つ右へ移動

インクリメンタル

(隣接ペアを一つ右へずらす)

デクリメンタル

(走査範囲を一つ狭める)

10個のデータのソート

n=10

no

yes

i=0

n<=1 no yes

stop

start バブルソートの

標準フローチャート

今の走査(スキャン)から抜け出す

a(0)a(1)………………a(9)

比較

計算量をみるのは

配列要素の比較と交換

最後はa(8)とa(9)の比較

バブルソート

ハンドシミュレーション

21 35 11 80 54

1回目の処理結果? 21 11 35 54 80

2回目の処理結果? 11 21 35 54 80

3回目の処理結果? 11 21 35 54 80

4回目の処理結果? 11 21 35 54 80

問題1:改良版バブルソート

1,2,3,4,5,6,7,8,910 のような

ソート済みのデータだと

どうなりますか?

上記をヒントにして、改良版

バブルソートの流れ図を示せ。

バブルソート改良版の解答例

ソート済みか否かのフラグ変数を設け,事前に

0とし,隣接データ交換処理をすればフラグ変

数を1に更新する.

このようにすれば,内部ループを抜け出した

時,フラグ変数をチェックし,0であればソート済

みとして停止すればよい.

計算量

(Time Complexity)

計算量

計算の手数がデータの個数nに対して

どのように増えるか?

あるアルゴリズムはどのくらい速いか?

つまり、計算速度(計算時間)は?

コンピュータ、OS、言語、コンパイラに

依存する

計算量 「アルゴリズムAはアルゴリズムBの2倍速い」 という言い方ではだめなのか?(できないのか?)

扱うデータ数が変わると速度比も変わる場合が

あるため,あまり意味がない

データ数Nと実行所要時間Tとの間の

一般的な関係を知りたい

計算量(2)

O(nの関数)の形で表す

このとき、定数係数は無視する

an2+bn+c O(n2)

オーダーという

オーダーが違う

オーダーが1桁違う

定数係数は無視する

O(1)

O(log n) O(n) O(n log n)

O(n2 )

O(n3 ) 多項式オーダー

・・・ O( 2n) 指数関数的

T(時間) = K * 1/2(N2-N)

= K/2 * N2-NK/2

バブルソートの場合

Kはプロセッサの速度

など様々な現実状況

をあらわしている

O(n2 )

(時間)計算量→ビッグO(オー)記法

• OはOrderの意味.

• アルゴリズムの実行時間は,コンピュータの性能に依存して変化する.実行時間実測値よりも,データ数と実行時間Tの関係が重要

• よって,定数や低次項は無視して,最大次数項に注目して,それをオーダーと呼び,O(~)と表記する.

• 記憶領域を議論するための領域計算量もあるが,ここでは時間計算量を計算量とよぶ.

ビッグオーのグラフ化

N 5 10 15 20 25

O(2n) 32 1024 32768 1048576 33554432

O(N2) 25 100 225 400 625

O(NlogN) 3.49 10 17.64 26.02 34.94

O(N) 5 10 15 20 25

O(logN) 0.69 1 1.17 1.30 1.39

O(1) 1 1 1 1 1

O(1)

O(logN)

O(N)

O(NlogN) O(N2) O(2n)

ビッグオーの

グラフ化

計算量の求め方

1.各処理実行回数を

データ数Nで表現

2.合計する

3.最大次数に注目して

ビッグOで表記.

問題

左記の最大値選出

アルゴリズムの計算量を

求めよ.

バブルソートの計算量(オーダー)

10,9,8,7,6,5,4,3,2,1 をバブルソートすると

比較回数は? 9+8+7…=45

交換回数は?9+8+7…=45

よってN個のデータの場合

問1:最大比較回数は?,最大交換回数は?

問2:平均比較回数は?,平均交換回数は?

問3:最小比較回数は?,最小交換回数は?

N個のデータのバブルソート

比較 交換

最大 (N-1)+(N-2)+…+1

=1/2N(N-1)=1/2(N2-N)

O(N2 )ビッグオー記法

(N-1)+(N-2)+…+1

=1/2N(N-1)=1/2(N2-N)

O(N2 )ビッグオー記法

平均 (N-1)+(N-2)+…+1

=1/2N(N-1)=1/2(N2-N)

O(N2 )ビッグオー記法

½*1/2(N2-N)=1/4(N2-N)

O(N2 )ビッグオー記法

最小 (N-1)+(N-2)+…+1

=1/2N(N-1)=1/2(N2-N)

O(N2 )ビッグオー記法

0