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

アルゴリズム論 (第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 # 1 0

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

(5)

ヒープ (Heap)

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

• ヒープ条件

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

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

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

(6)

ヒープ (Heap)

3 1

2 7 2 3

9 1 9 1 2 1 0

7 4 2

# 1

# 2 # 3

# 4 # 5 # 6 # 7

# 8 # 9 # 1 0

(7)

紹介する操作

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

ヒープへのノードの追加

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

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

(8)

下降修復 (Downheap)

1.

ノード

v

の値がそのどちらかの子の値より 小さければ

2.

値が大きい方の子

w

の値と

v

の値を入れ替える

3. w

に対して下降修復を行う

(9)

下降修復 (Downheap)

9 1 5

5

4 # v

# 2 v # 2 v + 1

# 4 v # 4 v + 1 8

9 1 5

5 4

# v

# 2 v # 2 v + 1

# 4 v # 4 v + 1 8

9 1 5

5 4

# v

# 2 v # 2 v + 1

# 4 v # 4 v + 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 1 5

4

# 1

# 2 # 3

# 4 # 5

8

9 1 5

4 # 1

# 2 # 3

# 4 # 5

8

9 1 5 4

# 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

5 5

9 1 5

4

# 1

# 2 # 3

# 4 # 5

8 5

(19)

ヒープソート

1.

ヒープ化

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

2.

ルートの値を取り出す.

最後のノードと交換

※ ルートの値は最大となることに注意

3.

下降修復する.

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

2., 3.

を繰り返すことによりソートが可能

(20)

ヒープソート

9 1 5

4

# 1

# 2 # 3

# 4 # 5

5 8

1 8

# 6

9 1 5

4 # 1

# 2 # 3

# 4 # 5

5 8 1 8

# 6

9 1 5 4

# 1

# 2 # 3

# 4 # 5

5 8 1 8

# 6

9 1 5

4 # 1

# 2 # 3

# 4 # 5

8

5 1 8

# 6

9

1 5

4

# 1

# 2 # 3

# 4 # 5

8

5 1 8

# 6

9 1 5

4

# 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

9 1 5

4

# 1

# 2 # 3

# 4 # 5

8

5 1 8

# 6

9 1 5

4

# 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

9 1 5

4 # 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

9 1 5

4

# 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

9 1 5

4 # 1

# 2 # 3

# 4 # 5

8 5

1 8

# 6

9 1 5

4 # 1

# 2 # 3

# 4 # 5

8 5

1 8

# 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 1 5

4

# 1

# 2 # 3

# 4 # 5

2 4 7

a d d n e w

9 1 5

4

# 1

# 2 # 3

# 4 # 5

2 4 7

9 1 5

4

# 1

# 2 # 3

# 4 # 5

2 4

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, f

のファイルに分配

fa: 29 32 34 19 50 33 49 100

f: 21 10 43 60

これから、

fa, f

をマージして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

f: 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 f: 33 49 100

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

ソート終了

(29)

ファイルの merge

P.66

P.69

のプログラム解説

main:

メインプログラム

初期設定

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

nmsort: distribute

merge

を繰り返してソート

distribute:

連ごとにファイルへ分散

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

merge: 2

つのファイル

fa, f

を連ごとにマージ

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.

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

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

参照

関連したドキュメント

熱力学計算によれば、この地下水中において安定なのは FeSe 2 (cr)で、Se 濃度はこの固相の 溶解度である 10 -9 ~10 -8 mol dm

Maurer )は,ゴルダンと私が以前 に証明した不変式論の有限性定理を,普通の不変式論

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

Maurer )は,ゴルダンと私が以前 に証明した不変式論の有限性定理を,普通の不変式論

Frauwallner [1937:287] は下す( Kataoka (forthcoming1) 参照).本質において両者に意見の相違は ないと言うのである( Frauwallner [1937:280, n.1]

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

危険な状況にいる子どもや家族に対して支援を提供する最も総合的なケンタッキー州最大の施設ユースピリタスのト

日本遠洋施網漁業協同組合、日本かつお・まぐろ漁業協同組合、 (公 財)日本海事広報協会、 (公社)日本海難防止協会、