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

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
33
0
0

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

全文

(1)

アルゴリズム論

(第13回)

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

講師

山田敬三

[email protected]

(2)

期末試験

1/26() 14:4016:10,共301講義室

各自が履修しているクラスで受験すること

(でなければ,評価されない)

座席指定あり

持ち込み:一切不可(鉛筆と消しゴムのみ可)

解答時間:60分

1/31() 採点(参加者は +10点)

(3)

ヒープ

(4)

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

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

あるノード 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

(5)

ヒープ (Heap)

• 以下のヒープ条件を満たす 完全二分木 (配列で実現可能)

• ヒープ条件

任意のノードが持つ値は,

そのノードのどちらの子の

持つ値より,大きいか等しい.

(6)

ヒープ (Heap)

31

27 23

9 19 12 10

7 4 2

#1

#2 #3

#4 #5 #6 #7

#8 #9 #10

(7)

紹介する操作

ヒープ化(ヒープを作る)

ヒープへのノードの追加

ヒープからのノードの削除

ヒープソート(ヒープを利用した整列アルゴリズム)

(8)

下降修復 (Downheap)

1. ノードvの値がそのどちらかの子の値より 小さければ

2. 値が大きい方の子wの値とvの値を入れ替える

3. wに対して下降修復を行う

(9)

下降修復 (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

(10)

下降修復 (Downheap)

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

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

else

左の子をwとする;

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

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

(11)

ヒープ化

木の下方の部分木から下降修復を繰り返す.

4 1

9 0

5 8 2

7

6 3

(12)

4 1

9 0

5 8 2

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 1

9 2

5 8 0

7

6 3

(14)

4 1

9 2

5 8 0

7

6 3

4 1

9 2

5 8 0

7

6 3

(15)

4 1

9 2

5 8 0

7

6 3

4 9

8 2

5 1 0

7

6 3

(16)

4 9

8 2

5 1 0

7

6 3

9 8

5 2

4 1 0

7

6 3

(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)

上昇修復 (Upheap)

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

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

3. uに対して上昇修復を行う.

(23)

上昇修復 (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

(24)

マージソート

(25)

内部ソートと外部ソート

内部ソート

主記憶を使用

外部ソート

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

一般に,主記憶より補助記憶の方が容量が大きい (bit 単価も安い)

(26)

ファイルの merge

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

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

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

続ける

• どちらかが終わったら、数値が残って

いるファイルの中身を ccc へ書き込む

(27)

( 自然 ) マージ( 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 これを繰り返す

(28)

マージ( 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

ソート終了

(29)

ファイルの merge

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

main: メインプログラム

初期設定

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

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

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

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

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

copyarun: fから連を抽出する

(30)

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

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

• fseek( fp, offset, code)

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

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

• ftell(fp)

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

• ランダムアクセスを使用してクイック

ソートを行う (P.71 ~ 73)

(31)

安定な (stable) ソート

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

345 Patterson 289 Taylor

345 Johnson

289 Taylor

345 Patterson 345 Johnson

安定したソート

289 Taylor 345 Johnson 345 Patterson

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

(32)

ソートの評価

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

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

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

ハードディスク:○

Qsort ×Msort

仮想ディスク:

×Qsort

Msort

(33)

ソートの評価

1.

マージソートは一時的なファイルを使用 するが,クイックソートは使用しない

2.

クイックソートはランダムアクセスに基づく ため,ランダムアクセスが出来ないデバ イスや開発言語では実現できない.

3.

すでに,ほぼ昇順になっている場合は,

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

4.

マージソートは安定な

(stable)

ソートである.

(クイックソートは安定でない)

5.

クイックソートのキーの比較回数は,

マージソートに比べてはるかに小さい.

参照

関連したドキュメント

Effects of Ginkgo biloba extract in improving episodic memory of patients with mild cognitive impairment: A randomized controlled trial... Is there a risk of bleeding associated

WAV/AIFF ファイルから BR シリーズのデータへの変換(Import)において、サンプリング周波 数が 44.1kHz 以外の WAV ファイルが選択されました。.

【ご注意点】 ・カタログの中からお好みの商品を1点お 選びいただき、同封のハガキに記載のお

画像の参照時に ACDSee Pro によってファイルがカタログ化され、ファイル プロパティと メタデータが自動的に ACDSee

※ログイン後最初に表示 される申込メニュー画面 の「ユーザ情報変更」ボタ ンより事前にメールアド レスをご登録いただきま

やま くず つち いし いわ みず いきお..

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)

~3kVA 4kVA~6kVA 7kVA~49kW ~5kW 6kW~49kW. 料金 定額制 従量制