Upload
dokiet
View
218
Download
0
Embed Size (px)
Citation preview
反復構造 (一定回数のループ処理)
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) 終了条件は? 後処理→何を出力?
カウント処理 (配列を使う)
前提: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つのデータを比較.
② 左>右ならば入れ替え.左<右ならそのまま.
③ 右へ一つ移動して②を実行.
④ ソート済のデータに到達したら③を停止し,
左端に戻る.
4要素のバブルソート
2
×
a(0)
4
×
a(1)
1
a(2)
3
a(3)
2
a(0)
4
×
1
a(1)
1
×
4
a(2)
3
a(3)
2
a(0)
1
a(1)
4
×
3
a(2)
3
×
4
a(3)
2
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
バブルソート改良版の解答例
ソート済みか否かのフラグ変数を設け,事前に
0とし,隣接データ交換処理をすればフラグ変
数を1に更新する.
このようにすれば,内部ループを抜け出した
時,フラグ変数をチェックし,0であればソート済
みとして停止すればよい.
計算量 「アルゴリズムAはアルゴリズムBの2倍速い」 という言い方ではだめなのか?(できないのか?)
扱うデータ数が変わると速度比も変わる場合が
あるため,あまり意味がない
データ数Nと実行所要時間Tとの間の
一般的な関係を知りたい
定数係数は無視する
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
バブルソートの計算量(オーダー)
10,9,8,7,6,5,4,3,2,1 をバブルソートすると
比較回数は? 9+8+7…=45
交換回数は?9+8+7…=45
よってN個のデータの場合
問1:最大比較回数は?,最大交換回数は?
問2:平均比較回数は?,平均交換回数は?
問3:最小比較回数は?,最小交換回数は?