ソート(並替え,整列) アルゴリズム › japanese › 2014-a論 › 2...2014/10/03...

23
ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを 値の小さい順(昇順), 大きい順(降順)に並べ替えること 学生を学籍番号順, 都市を人口の多い順, ...

Upload: others

Post on 07-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

値の小さい順(昇順),

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

学生を学籍番号順,

都市を人口の多い順,

...

Page 2: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

コンピュータはTunnel Vision

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

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

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

Page 3: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

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

Page 5: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

列の左端から始めて

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

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

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

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

左端に戻る.

Page 6: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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)

Page 7: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

バブルソートにおける

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データ比較・交換

Page 8: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

データ交換

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

Page 9: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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)の比較

Page 10: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

バブルソート

ハンドシミュレーション

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

Page 11: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

ソート済みのデータだと

どうなりますか?

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

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

Page 12: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

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

数を1に更新する.

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

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

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

Page 13: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

計算量

(Time Complexity)

Page 14: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

計算量

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

どのように増えるか?

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

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

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

依存する

Page 15: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

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

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

一般的な関係を知りたい

Page 16: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

計算量(2)

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

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

an2+bn+c O(n2)

オーダーという

オーダーが違う

オーダーが1桁違う

Page 17: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

定数係数は無視する

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 )

Page 18: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

• OはOrderの意味.

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

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

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

Page 19: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

ビッグオーのグラフ化

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

Page 20: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

O(1)

O(logN)

O(N)

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

ビッグオーの

グラフ化

Page 21: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

計算量の求め方

1.各処理実行回数を

データ数Nで表現

2.合計する

3.最大次数に注目して

ビッグOで表記.

問題

左記の最大値選出

アルゴリズムの計算量を

求めよ.

Page 22: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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

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

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

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

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

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

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

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

Page 23: ソート(並替え,整列) アルゴリズム › japanese › 2014-A論 › 2...2014/10/03  · ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを

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