• 検索結果がありません。

アルゴリズム論 (第13回)

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズム論 (第13回)"

Copied!
31
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズム論

(第13回)

佐々木研(情報システム構築学講座)

講師 山田敬三

[email protected]

(2)

ヒープ

(3)

完全二分木の配列による実現

配列と簡単な計算式で実現可能

あるノード n に対して

親ノードは n/2

子ノードは 2n および 2n+1

#1

#2 #3

#4 #5 #6 #7

#8 #9 #10

#1 #2 #3 #4 #5 #6 #7 #8 #9 #10

(4)

ヒープ (Heap)

• 完全二分木で,以下の条件を満 たすもの

(配列で実現可能)

• ヒープ条件

• 任意のノードの値は,そのノード

のどちらの子の値よりも大きいか

等しい.

(5)

ヒープ (Heap)

31

27 23

9 19 12 10

7 4 2

#1

#2 #3

#4 #5 #6 #7

#8 #9 #10

(6)

下降修復 (Downheap)

ヒープ条件を満たしていない 完全二分木をヒープ化する.

1. ノードvの値がそのどちらかの子の値より小さければ 2. 値が大きい方の子wの値とvの値を入れ替える

3. wに対して下降修復を繰り返す.

(7)

下降修復 (Downheap)

9 15

5

4 #v

#2v #2v+1

#4v #4v+1 8

9 15

5 4

#v

#2v #2v+1

#4v #4v+1 8

9 15

5 4

#v

#2v #2v+1

#4v #4v+1 8

(8)

下降修復 (Downheap)

if(v>(N/2)) return;

if(右の子がある&&左の子よりも右の子が大きい) 右の子をwとする;

else

左の子をwとする;

if(vよりもwが大きい) { vとwを交換;

wを頂点とする部分木に対して下降修復 }

(9)

ヒープ化

大きな木は,下方の部分木から 繰り返す.

4 1

9 0

5 8 2

7

6 3

(10)

4 1

9 0

5 8 2

7

6 3

4 1

9 2

5 8 0

7

6 3

配列

(11)

4 1

9 2

5 8 0

7

6 3

4 1

9 2

5 8 0

7

6 3

(12)

4 1

9 2

5 8 0

7

6 3

4 1

9 2

5 8 0

7

6 3

(13)

4 1

9 2

5 8 0

7

6 3

4 9

8 2

5 1 0

7

6 3

(14)

4 9

8 2

5 1 0

7

6 3

9 8

5 2

4 1 0

7

6 3

(15)

上昇修復 (Upheap)

新要素を追加した場合,上昇修復を行うことでヒー プを復元

1. ノードvの値がその親uの値より大きければ 2. uとvの値を交換

3. uに対して上昇修復を繰り返す.

(16)

上昇修復 (Upheap)

9 15

4

#1

#2 #3

#4 #5 24 7

add new

9 15

4

#1

#2 #3

#4 #5 24

7

9 15

4

#1

#2 #3

#4 #5 24

7

(17)

ノードの削除

1. あるノードを削除した場合

2. N-1の要素を削除した部分に 移動

※すなわち,配列の最後の要素

3. そこから下降修復を行うことに よりヒープを修復する.

(18)

ノードの削除

9 15

4

#1

#2 #3

#4 #5 8

9 15

4 #1

#2 #3

#4 #5 8

9 15 4

#1

#2 #3

#4 #5 8 5

18

#6

5 5

9 15

4

#1

#2 #3

#4 #5 8 5

(19)

ヒープソート

1. ヒープ化

配列を完全二分木とみなし ヒープ化する.

2. ルートの値を取り出す.

最後のノードと交換

※ルートの値は最大

3. 残りのノードをヒープ化する.

ノードの削除と同様の処理

2., 3. を繰り返すことによりソートが可能

(20)

ヒープソート

9 15

4

#1

#2 #3

#4 #5 8 5

18

#6

9 15

4 #1

#2 #3

#4 #5 8

5 18

#6

9 15 4

#1

#2 #3

#4 #5 8

5 18

#6

9 15

4 #1

#2 #3

#4 #5 8

5 18

#6

9

15

4

#1

#2 #3

#4 #5 8

5 18

#6

9 15

4

#1

#2 #3

#4 #5 8

5

18

#6

9 15

4

#1

#2 #3

#4 #5 8

5 18

#6

9 15

4

#1

#2 #3

#4 #5 8 5

18

#6

9 15

4 #1

#2 #3

#4 #5

8 5

18

#6

9 15 4

#1

#2 #3

#4 #5

8 5

18

#6

9 15

4 #1

#2 #3

#4 #5

8 5

18

#6

9 15

4 #1

#2 #3

#4 #5

8 5

18

#6

(21)

ヒープソートの計算量

• 交換回数

ヒープの木,log2N

N個の要素に対して操作

最悪log2N段分の交換

O(Nlog2N)

• 比較回数

交換回数と同じ

左右の比較を行うから2

O(2Nlog2N)→ O(Nlog2N)

(22)

マージソート

(23)

内部ソートと外部ソート

内部ソート

主記憶を使用

外部ソート

ファイルを直接操作してソートを行う.

一般に,主記憶より補助記憶の方が容量が大きい

(24)

ファイルの merge

• P.64~P.65のプログラム解説

• ファイルaaa, ファイルbbbから同時に 1つずつ数値を読み込み、小さい値 をファイルcccに書き込む

• aaa,bbbのどちらかが終わるまで続け

• どちらかが終わったら、数値が残って いるファイルの中身をcccへ書き込む

(25)

自然マージ( merge )ソート

連(run):順序つけられた部分

f: 29 32 34 21 19 50 10 43 33 49 100 60 下線で示した連をfa, fbのファイルに分配

fa: 29 32 34 19 50 33 49 100 fb: 21 10 43 60

これから、fa, fbをマージしてfに書き込む

f: 21 29 32 34 10 19 43 50 60 33 49 100 これを繰り返す

(26)

自然マージ( merge )ソート

f: 21 29 32 34 10 19 43 50 60 33 49 100

fa: 21 29 32 34 33 49 100 fb: 10 19 43 50 60

f :10 19 21 29 32 34 43 50 60 33 49 100

fa: 10 19 21 29 32 34 43 50 60 fb: 33 49 100

f: 10 19 21 29 32 33 34 43 49 50 60 100 ソート終了

(27)

ファイルの merge

P.66P.69のプログラム解説

main: メインプログラム

初期設定

ファイルからデータ入力と、結果出力

nmsort: distributemergeを繰り返してソート

distribute: 連ごとにファイルへ分散

copyarunを呼び出してfa, fbへ連をコピー

merge: 2つのファイルfa, fbを連ごとにマージ

copyarun: fから連を抽出する

(28)

ランダムアクセスを使ったソート

• ランダムアクセスを行う関数

fseek( fp, offset, code)

ファイルの読み取り(書き込み)開始場所 を指定する。

fseek(fp, 0L, SEEK_END)でファイルの長さ が確認できる。

ftell(fp)

現在のファイルの読み取り(書き込み)開 始位置を確認する。

• ランダムアクセスを使用してクイック ソートを行う(P.71~73)

(29)

安定な (stable) ソート

同じキーを持つレコードの順番がソート後も 保持されるソートのこと。

345 Patterson 289 Taylor

345 Johnson

289 Taylor

345 Patterson 345 Johnson

安定したソート

289 Taylor 345 Johnson 345 Patterson

クイックソートの場合は こうなることがある。

(30)

ソートの評価

• クイックソートも自然マージソートも O(n log n)

• 自然マージソートはクイックソートに 比べて多くのファイル空間を使用す る。

• ハードウェアの条件によっては,ク イックソートが遅い場合もある.

ハードディスク:○Qsort ×Msort

仮想ディスク: ×Qsort Msort

(31)

ソートの評価

1. 自然マージソートは一時的なファイルを 使用するが、クイックソートは使用しない 2. クイックソートはランダムアクセスに基づ

いているため、ランダムアクセスが出来な いハードウェアや開発言語では実現不可 3. すでに,ほぼ昇順になっている場合は,

自然マージソートの方が速い.

4. 自然マージソートは安定な(stable)ソート である.(クイックソートは違う)

5. クイックソートのキーの比較回数は、自然 マージソートに比べてはるかに低い。

参照

関連したドキュメント

 第一の方法は、不安の原因を特定した上で、それを制御しようとするもので

• ネット:0個以上のセルのポートをワイヤーを使って結んだも

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

限られた空間の中に日本人の自然観を凝縮したこの庭では、池を回遊する園路の随所で自然 の造形美に出会

第2 この指導指針が対象とする開発行為は、東京における自然の保護と回復に関する条例(平成12年東 京都条例第 216 号。以下「条例」という。)第 47

計量法第 173 条では、定期検査の規定(計量法第 19 条)に違反した者は、 「50 万 円以下の罰金に処する」と定められています。また、法第 172

エッジワースの単純化は次のよう な仮定だった。すなわち「すべて の人間は快楽機械である」という

会議名 第1回 低炭素・循環部会 第1回 自然共生部会 第1回 くらし・環境経営部会 第2回 低炭素・循環部会 第2回 自然共生部会 第2回