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

ヒントスライドPDF プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPDF プログラミング演習2 #prog2bkc net"

Copied!
22
0
0

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

全文

(1)

第10週

ソート(2)

ヒープソートの準備

(2)

木構造

データを木(ツリー)状に配置したデータ構造

ノード: 各節点(下図の )

• キー: 各ノードが持っているデータ (下図の8, 4, 9, 12, ...)

• ルート(根): 一番上のノード(下図の )

8

4 9 12

6

1 10

8

深さ

( この場合は3)

データ構造とアルゴリズムの資料参照

(3)

木構造

• 葉: 末端のノード(下図の )

親: 1つ上のノード(下図では に対して )

• 子: 1つ下のノード(下図では に対して )

• 兄弟: 同じ階層で同じ親を持つノード( と 等)

• 他にも、先祖、子孫、部分木などの用語がある

8

4 9 12

6

1 10

1

6

6 9

4

4 1 6

1 6

10

(4)

二分木

8

4 10

12 6

1

二分木(binary tree):

すべてのノードの子が2個以下の木

右の子と左の子を区別

完全二分木:

すべての葉の深さの差が1以下の二分木 (葉は左側から詰める)

8

4 10

6 1

0

深さの 差が2

左詰めでない

完全二分木 ではない例

(5)

必須課題10-1:ヒープ木

最小ヒープ

完全2分木

子供が2

– 要素が左から空きがない

• 親は子より小さいか同じ

4

18

20 32

10 15

38 13 29

ルート

(6)

必須課題10-2:ヒープの1次元配列(1基準)

4

18

32 20 10 15

38 13 29

4 7 18 10 15 32 20 38 13 29

0 1 2 3 4 5 6 7 8 9

1

2 3

4 5 6 7

8 9 10

ヒープ構造などの完全2分木 は、配列の添字は右図のよ うに親から順に割り当てら れる

10

1基準の場合は、

0番目の要素は利用しない

(7)

必須課題10-2:親子の参照方法(1基準の場合)

親子関係

親 :n/2

子(左):2*n

子(右):2*n+1

例:n4の場合

親: 4/2 = 2

子(左): 2 * 4 = 8

子(左): 2 * 4 + 1 = 9

4

18

32 20 10 15

38 13 29

4 7 18 10 15 32 20 38 13 29

0 1 2 3 4 5 6 7 8 9

1

2 3

4 5 6 7

8 9 10

10

(8)

必須課題10-2:check_heap(最小ヒープ)

int check_heap(int a[], int N)

一次元配列で

表現されたヒープ

ヒープのサイズ

返り値 1:最小ヒープの条件

すべてのノードで下記の条件を満たす

「ノードのキーはその親のキーよりも大きいか等しい」 0:上記の条件を満たさない場合

(9)

必須課題10-3:insert

void insert(int val, int a[], int *N);

一次元配列で

表現されたヒープ

ヒープのサイズ (ポインタ渡し) 挿入される値

STEP1:ヒープの最後に新しいノードを挿入する STEP2:親と比較する

・親より値が小さかったら場合: 交換

・同じか大きい場合: 処理終了

交換がされ、ルートノードでない場 合はSTEP2を繰り返す

(10)

必須課題10-3:insertの例:1/4

4

18

32 20 10 15

38 13 29

1

2 3

4 5 6 7

8 9 10

STEP1:ヒープの最後に新しいノードを挿入する

この場合、添字11に値5のノードを追加する

11

(11)

必須課題10-3:insertの例:2/4

4

19

32 20 10 15

38 13 29

1

2 3

5 6 7

8 9 10

STEP2:親と比較する

・親より値が小さかったら場合: 交換

・同じか大きい場合 処理終了

親 : 11/2 = 5

交換

11 4

(12)

必須課題10-3:insertの例:3/3

4

18

32 20 10 5

38 13 29

1

2 3

4 5 6 7

8 9 10

15

STEP2:親と比較する

・親より値が小さかったら場合: 交換

・同じか大きい場合 処理終了

交換

11

親 : 5/2 = 2

(13)

必須課題10-3:insertの例:4/4

4

5 18

32 20 10 7

38 13 29

1

2 3

4 5 6 7

8 9 10

15

STEP2:親と比較する

・親より値が小さかったら場合: 交換

・同じか大きい場合: 処理終了

交換なし

11

親 : 2/2 = 1

(14)

必須課題10-3:insert:参考プログラム

int main(){

int heap[HEAP_SIZE+1]; int heap_size = 0;

/* 略:変数宣言、ヒープの初期化 */

insert( , heap, &heap_size);

//ヒープ条件が成立しているかどうかチェックして出力

printf(“HEAP_CHECK = %d¥n", check_heap(heap, heap_size) ); //ヒープ領域の内容表示

printf("HEAP = [ ");

for(i = 1; i <= heap_size; i++){ printf("%d ", heap[i]); }

printf("]¥n");

return 0; }

挿入する値

この処理(挿入)を 複数回繰り返す

ヒープの一次元配列:1基準なので+1 現在のヒープのサイズ

10-2の関数

(15)

必須課題10-4:deletemin

STEP1:

ルートノードを取り出し

末尾のノードをルートに持ってくる

STEP2:

左右の子供の値の小さい方と比較

・子供の方が小さい場合: 交換

・親の方が大きいか同じ場合: 処理終了

int deletemin(int a[], int *N);

一次元配列で

表現されたヒープ

ヒープのサイズ (ポインタ渡し) 取り出されてた値

交換され一番下のノードでない場 合はSTEP2を繰り返す

(16)

必須課題10-4:deleteminの例:1/4

4

5 18

32 20 10 7

38 13 29

1

2 3

4 5 6 7

8 9 10

15

11

STEP1:

ルートノードを取り出し

末尾のノードをルートに持ってくる

(17)

必須課題10-4:deleteminの例:2/4

15

5 18

32 20 10 7

38 13 29

1

2 3

4 5 6 7

8 9 10

STEP2:

左右の子供の値の小さい方と比較

・子供の方が小さい場合: 交換

・親の方が大きいか同じ場合: 処理終了

子(左): 2*1 = 2

子(右): 2*1+1 = 3

交換

(18)

必須課題10-4:deleteminの例:3/4

5

15 18

32 20 10 7

38 13 29

1

2 3

4 5 6 7

8 9 10

STEP2:

左右の子供の値の小さい方と比較

・子供の方が小さい場合: 交換

・親の方が大きいか同じ場合: 処理終了

子(左): 2*2 = 4

子(右): 2*2+1 = 5

>

交換

(19)

必須課題10-4:deleteminの例:4/4

5

7 18

32 20 10 15

38 13 29

1

2 3

4 5 6 7

8 9 10

STEP2:

左右の子供の値の小さい方と比較

・子供の方が小さい場合: 交換

・親の方が大きいか同じ場合: 処理終了

子(左): 2*5 = 10

子(右): 2*5+1 = 11

交換なし

右の子供はいなので 省略

(20)

必須課題10-4:deletemin確認用プログラム

int main(){

int heap[HEAP_SIZE+1]; int heap_size = 0;

/* 略:変数宣言、ヒープの初期化 */

//ヒープ領域の内容表示 printf("HEAP = [ ");

for(i = 1; i <= heap_size; i++){ printf("%d ", heap[i]); }

printf("]¥n");

for(i = 0; i < ; i++){

printf(“DELETED = %d¥n”, deletemin(heap, &heap_size) ); //ヒープ領域の内容表示

printf("HEAP = [ ");

for(j = 1; j <= heap_size; j++){ printf("%d ", heap[j]); }

printf("]¥n"); }

return 0;

deleteminを実行する回数

(21)

その他の注意事項

10週目の課題では、

動的メモリ確保(malloc)が不要

• 固定長の配列で実現可能

必須課題10-2

int check_heap(int *a, int N); int a[]でも同じ

(22)

著者リスト

1. 安積 卓也(情報システム学科)

2. 大森 隆行(情報システム学科)

参照

関連したドキュメント

Taking into account the patterns xx and xyx is enough to correctly compute DX(n, n − 2), but to compute G (n−2) n,t an additional pattern has to be considered: a pattern xyzx

ピアノの学習を取り入れる際に必ず提起される

社会調査論 調査企画演習 調査統計演習 フィールドワーク演習 統計解析演習A~C 社会統計学Ⅰ 社会統計学Ⅱ 社会統計学Ⅲ.

2 号機の RCIC の直流電源喪失時の挙動に関する課題、 2 号機-1 及び 2 号機-2 について検討を実施した。 (添付資料 2-4 参照). その結果、

人身份证明文件、权利人身份证明文件(中译本) PDF 文件 大小限定为 5M 内,其他的 PDF 文件均限定在 1M 以内,图 片格式必须为 JPG 或者 BMP

図 5.2.2.2~図 5.2.2.5 より,SA 発生後 10 -2 年前までに,原子炉格納容器の最高 圧力及び最高温度となり,10

国際地域理解入門B 国際学入門 日本経済基礎 Japanese Economy 基礎演習A 基礎演習B 国際移民論 研究演習Ⅰ 研究演習Ⅱ 卒業論文

授業は行っていません。このため、井口担当の 3 年生の研究演習は、2022 年度春学期に 2 コマ行います。また、井口担当の 4 年生の研究演習は、 2023 年秋学期に 2