26
アルゴリズムと アルゴリズムと データ構造 データ構造 コンピュータサイエンスコース コンピュータサイエンスコース 知能コンピューティングコース 知能コンピューティングコース 第4回 第4回 スタック,キュー,ヒープ ヒープソート 塩浦昭義 塩浦昭義 情報科学研究科 情報科学研究科 准教授 准教授 [email protected] [email protected] http:// http:// www.dais.is.tohoku.ac.jp/~shioura/teaching www.dais.is.tohoku.ac.jp/~shioura/teaching

アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

アルゴリズムとアルゴリズムと データ構造データ構造 コンピュータサイエンスコースコンピュータサイエンスコース

知能コンピューティングコース知能コンピューティングコース

第4回第4回 スタック,キュー,ヒープ ヒープソート

塩浦昭義塩浦昭義

情報科学研究科情報科学研究科

准教授准教授

[email protected]@dais.is.tohoku.ac.jphttp://http://www.dais.is.tohoku.ac.jp/~shioura/teachingwww.dais.is.tohoku.ac.jp/~shioura/teaching

Page 2: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

データ構造とは?データ構造とは?

• アルゴリズムの中で,与えられた問題に関連する データ集合を管理するための道具

• 良いデータ構造とは?

– データ管理に必要な時間が短い

– シンプル

– 必要な領域計算量(記憶容量,領域量)が小さい

Page 3: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

集合を管理する:集合を管理する: 双方向リストの利用双方向リストの利用• 双方向リストを利用して集合を表現する

– 必要な領域計算量は集合のサイズに等しい

– 整数の追加,削除はO(1)時間で可能

連結リストの初と 後の

セルへのポインタ連結リストの

本体

セルの構成:要素(整数)前のセルへのポインタ次のセルへのポインタ

null 6 3 1 9 null

C言語では,構造体により実現可能

Page 4: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

集合に対する特殊な演算と集合に対する特殊な演算と データ構造データ構造

• も新しい要素を常に削除する

スタック

• も古い要素を常に削除する

待ち行列(キュー)

• も小さい(大きい)要素を常に削除する

優先度付き待ち行列,ヒープ

Page 5: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

スタックスタック

• も新しい要素を常に削除するときに使うデータ構造

• 次のような図で表現されることが多い

391

集合3, 9, 1

3915

5を追加

3915

2を追加

2

3915

新の要素2を削除

3915

8を追加

8

3915

新の要素8を削除

391

新の要素5を削除

Page 6: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

スタックとバックトラックスタックとバックトラック

• スタックはバックトラック探索を行なうときによく使われる

• 例:迷路の探索:進んだ道を戻ったりしながらゴールを目指す

– 可能性がある限り先に進む

ゴールへ到達する可能性がなくなったら戻る

– これまで進んできた道を覚えるために,スタックを使う

s

ab

c de

f

h

s

i jk

acde

g

hij

bx

x xxfg

x

xk

goal!

start

Page 7: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

スタックの実現方法スタックの実現方法

• 双方向リストを使えばよい

• 要素を追加するとき,リストの先頭に追加

リストの要素は,新しいものから古いものへと並ぶ

• も新しい要素を削除したい

リストの先頭の要素を削除すればよい

追加も削除もO(1)時間でできる

6 3 1 9 nullnull 5

新しい 古い

Page 8: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

待ち行列(キュー)待ち行列(キュー)

• も古い要素を常に削除するときに使うデータ構造

集合

3, 9, 1

5を追加

391

3915

3915

2を追加

古の要素3を削除

915

8を追加

9152

2

2

8

1528古の要素9を削除

528古の要素1を削除

ジョブの処理の際に利用

Page 9: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

待ち行列の実現方法待ち行列の実現方法

• 双方向リストを使えばよい

• 要素を追加するとき,リストの先頭に追加

リストの要素は,新しいものから古いものへと並ぶ

• も古い要素を削除したい

リストの 後尾の要素を削除すればよい

追加も削除もO(1)時間でできる

6 3 1 9 nullnull 5

新しい 古い

Page 10: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープヒープ• も小さい(大きい)要素を常に削除するときに使うデータ構造

– 新しい要素の追加, 小要素の削除は

O(log n) 時間

• 2分木により表現される

– 2分木:葉以外の各節点が高々2つの子をもつ根付き木

– 完全2分木:葉以外の節点の子がちょうど2つ

• 2分木の各節点は要素に対応2

7

9

10

4

7 4 12

13 11

根深さ0

葉木の高さ

h=3

深さ1

深さ2

深さ3

子孫

先祖

Page 11: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープの条件ヒープの条件

• 次の条件を満たす2分木をヒープと呼ぶ

(1)木の高さが

h

深さ

h-1 までは完全2分木

深さ

h では,左側に葉が詰められている

(2)親の要素の値≦子の要素の値2

7

9

10

4

7 4 12

13 11

根深さ0

木の高さ h=3

深さ1

深さ2

深さ3

根の要素が小値

木の高さ=

Page 12: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープではない2分木の例ヒープではない2分木の例

• 次の条件を満たす2分木をヒープと呼ぶ

(1)木の高さが

h

深さ

h-1 までは完全2分木

深さ

h では,左側に葉が詰められている

(2)親の要素の値≦子の要素の値5

7

3

10

4

7

4 12

13 11

根深さ0

深さ1

深さ2

深さ3

××

×

Page 13: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープの実現方法ヒープの実現方法

• ヒープは2分木

ポインタと構造体を使って 実現可能

• ヒープは配列を使っても

実現可能こちらが一般的

根から葉に向かって上から下に,左から右に番号を付けるこの順番で配列に入れる

2

7

9

10

4

7 4 12

13 11

0

1 2

63 4 5

7 8 9

0 1 2 3 4 5 6 7 8 9 102 7 4 9 7 4 12 10 13 11 -

Page 14: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープの配列による実現ヒープの配列による実現

根と 後の要素は簡単に見つかる:

A[0] は根A[n-1]は 後の要素

(n: 要素の数) 2

7

9

10

4

7 4 12

13 11

0

1 2

63 4 5

7 8 9

0 1 2 3 4 5 6 7 8 9 102 7 4 9 7 4 12 10 13 11 -

後の 要素

与えられた要素A[k]の子が簡単に見つかる:左の子

A[2k+1]

右の子

A[2k+2]

全てO(1)時間で可能

与えられた要素の親が簡単に見つかる:

親 子

Page 15: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

小の要素を削除する小の要素を削除する

• 根の要素が 小値

(1)根の節点を削除

ヒープでなくなる木の修正

(2)一番深いレベルの右側の葉を根に移動

2分木になった

しかし,新しい根に対し,

「親の要素≦子の要素」

の条件は成り立たない

2

7

9

10

4

7 4 12

13 11

Page 16: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

小の要素を削除する小の要素を削除する

(3)新しい根の要素を子と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

– 2つの子のうち,要素の小さい方の子と親を交換

交換後は「親の要素≦子の要素」

が成り立つ 11

7

9

10

4

7 4 12

13

交換する子の選び方 を間違えると,

条件が成り立たない

親の方が大きい

右の子が小さい

Page 17: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

小の要素を削除する小の要素を削除する

(3)新しい根の要素を子と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

– 2つの子のうち,要素の小さい方の子と親を交換

交換後は「親の要素≦子の要素」

が成り立つ 11

7

9

10

4

7 4 12

13

右の子が小さい

Page 18: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

小の要素を削除する小の要素を削除する

(3)新しい根の要素を子と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

– 2つの子のうち,要素の小さい方の子と親を交換

交換後は「親の要素≦子の要素」

が成り立つ 4

7

9

10

11

7 4 12

13

親子の入れ替えの回数≦

木の高さ

時間計算量は

Page 19: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

新しい要素を追加する新しい要素を追加する

(1)一番深いレベルの も右側の葉の隣(空きがない場合は次の レベルの一番左)に新しい要素を挿入

4

7

9

10

11

7 4 12

13 5

Page 20: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

新しい要素を追加する新しい要素を追加する

(1)一番深いレベルの も右側の葉の隣(空きがない場合は次の レベルの一番左)に新しい要素を挿入

(2)新しい要素を親と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

4

7

9

10

11

7 4 12

13 5

Page 21: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

新しい要素を追加する新しい要素を追加する

(1)一番深いレベルの も右側の葉の隣(空きがない場合は次の レベルの一番左)に新しい要素を挿入

(2)新しい要素を親と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

4

7

9

10

11

5 4 12

13 7

Page 22: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

新しい要素を追加する新しい要素を追加する

(1)一番深いレベルの も右側の葉の隣(空きがない場合は次の レベルの一番左)に新しい要素を挿入

(2)新しい要素を親と比較し,「親の要素>子の要素」が

成り立つときは,繰り返し親子を交換

4

5

9

10

11

7 4 12

13 7

この親子は交換しない

ステップ(2)が行なわれる度に新しい要素は

一つ上に上がる反復回数≦木の高さ時間計算量は

Page 23: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープソートヒープソート

• ヒープを使った整列アルゴリズム

• アルゴリズムの手順

(1)与えられた数の集合を順番にヒープに追加(n 回)

(2)ヒープから 小要素を次々に削除,並べる(n 回)

O(n log n) 時間

1

3

7

9

6

3

6

7

9

3

7 9

7, 3, 9, 6, 1 を順に追加

3

7

Page 24: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

ヒープソートヒープソート

• ヒープを使った整列アルゴリズム

• アルゴリズムの手順

(1)与えられた数の集合を順番にヒープに追加(n 回)

(2)ヒープから 小要素を次々に削除,並べる(n 回)

O(n log n) 時間

1

3

7

9

6

3

6

7

9

6

7 9

小要素を順に削除

7

9

1 3 6 7 9

Page 25: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

レポート(プログラム作成)レポート(プログラム作成)

• これまで授業で紹介した整列アルゴリズムのうち,2つ以上を選ん でプログラミングせよ.

• 提出方法:電子メールにファイルを添付して塩浦のアドレスに送付

– メールの件名は「アルゴリズムとデータ構造第4回レポート」

– 大学のメールアカウントより提出すること

• レポートをメールにて送信する際,添付するファイルはソースファイ ルのみ(***.c, ***.cpp など).

実行形式(a.out, ***.exeなど)は決して送らないこと!!

• メールには,以下のことを書くこと

– 学籍番号及び氏名

– 作成したプログラムに関する簡単な説明(どのアルゴリズムを プログラミングしたか,クイックソートの場合,どのような軸選択 法を使ったか,など)

• 締切:5月21日(木)午後7時まで

Page 26: アルゴリズムと データ構造 - dais.is.tohoku.ac.jpshioura/teaching/ad09/ad09-04.pdf · スタックとバックトラック • スタックはバックトラック探索を行なうときによく使われる

レポート(紙で提出)レポート(紙で提出)

(1)

数の集合{15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1}に対する ヒープを二分木の形で書きなさい

(2)

(1)で求めたヒープに対して, 小要素を削除するときの動作を, 図を使って詳しく説明せよ.

(3)

(2)で求めたヒープに対して,要素10を追加するときの動作を, 図を使って詳しく説明せよ.

(4)スタックは連結リスト(双方向ではないリスト)を使っても実現でき る.連結リストを用いた場合,追加と削除がO(1)時間で行えるこ

とを(図を使って)説明せよ.

締切:5月15日(木)午前9時頃