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

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

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPPT プログラミング演習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

20 32

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

例: n が 4 の場合

親:     4/2 = 2

子(左):  2 * 4 = 8

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

4

18

20 32

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:親と比較する

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

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

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

(10)

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

4

18

20 32

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

20 32

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

20 5 32

10

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

20 7 32

10

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

一次元配列で

表現されたヒープ

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

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

(16)

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

4

5 18

20 7 32

10

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

20 7 32

10

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

20 7 32

10

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

20 15 32

10

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

21

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

(22)

著者リスト

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

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

参照

関連したドキュメント

「1 建設分野の課題と BIM/CIM」では、建設分野を取り巻く課題や BIM/CIM を行う理由等 の社会的背景や社会的要求を学習する。「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 参照). その結果、

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

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

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

課題 学習対象 学習事項 学習項目 学習項目の解説 キーワード. 生徒が探究的にか