introduction to algorithms k-sekine/slides/ introduction to algorithms 6. heapsort 2011.7.7

Download INTRODUCTION TO ALGORITHMS k-sekine/slides/  INTRODUCTION TO ALGORITHMS 6. Heapsort 2011.7.7

If you can't read please download the document

Post on 17-Mar-2020

0 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • INTRODUCTION TO ALGORITHMS

    6. Heapsort

    2011.7.7 関根 渓 (情報知識ネットワーク研究室 B4)

  • CONTENTS

    6.1 ヒープ (Heap)

    6.2 ヒープ条件の維持

    (Maintaining the heap property)

    6.3 ヒープの構成 (Building a heap)

    6.4 ヒープソート (The heapsort algorithm)

    6.5 優先度付きキュー (Priority queues)

  • CONTENTS

    6.1 ヒープ (Heap)

    6.2 ヒープ条件の維持

    (Maintaining the heap property)

    6.3 ヒープの構成 (Building a heap)

    6.4 ヒープソート (The heapsort algorithm)

    6.5 優先度付きキュー (Priority queues)

  • 6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    16 14 10 8 7 9 3 2 4 1

    1 2 3 4 6

    5

    7 8 10 9

    1

    2 3

    4

    5

    6 7

    8 9 10

     (2分木)ヒープ((binary)heap)データ構造とは,

    下図に示すようなおおよそ完全2分木と見なすことができる配列のこと

     木の各節点は,その節点の値を格納している配列の要素に対応

  •  ヒープを表す配列が持つ2つの属性  length[A]

    ・・・配列Aの要素数

     heap-size[A]

    ・・・配列Aに含まれているヒープの要素数

    すなわち,A[1…length[A]]には正しい要素が 含まれているが,A[heap-size[A]]を超える要素 はどれもヒープの要素ではない

    ただし,heap-size[A]≦length[A]

    6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    16 14 10 8 7 9 3 2 4 1

    1 2 3 4 6

    5

    7 8 10 9

    1

    2 3

    4

    5

    6 7

    8 9 10

  • 木の根はA[1]であり,節点の添字iが与えら れたとき,

    その親 PARENT(i),

    左の子 LEFT(i),

    右の子 RIGHT(i)

    は簡単に計算できる

    PARENT(i)

    return 𝑖/2

    LEFT(i)

    return 2𝑖

    RIGHT(i)

    return 2𝑖 + 1

    6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    16 14 10 8 7 9 3 2 4 1

    1 2 3 4 6

    5

    7 8 10 9

    1

    2 3

    4

    5

    6 7

    8 9 10

  • 大抵の計算機では・・・

    LEFT:

    i の2進表現を1ビット左にシフトすることで 2i を計算

    RIGHT:

    i の2進表現を1ビット左にシフトしたあと,最 下位ビットを1にすることで2i+1を計算

    PARENT:

    i の2進表現を1ビット右にシフトすることで 𝑖/2 を計算

    6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    16 14 10 8 7 9 3 2 4 1

    1 2 3 4 6

    5

    7 8 10 9

    1

    2 3

    4

    5

    6 7

    8 9 10

  • 大抵の計算機では・・・

    LEFT:

    i の2進表現を1ビット左にシフトすることで 2i を計算

    RIGHT:

    i の2進表現を1ビット左にシフトしたあと,最 下位ビットを1にすることで2i+1を計算

    PARENT:

    i の2進表現を1ビット右にシフトすることで 𝑖/2 を計算

    ヒープソートのうまい手続きでは,

    これら3つの手続きはしばしば「マクロ」また は「インライン」手続きとして実現される

    6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    16 14 10 8 7 9 3 2 4 1

    1 2 3 4 6

    5

    7 8 10 9

    1

    2 3

    4

    5

    6 7

    8 9 10

  •  2分木ヒープの種類

    どちらもヒープ条件 (heap property) を満たす

     max-ヒープ

     根以外の任意の節点i が A[PARENT(i)]≧A[i] を満たす

    (max-ヒープ条件 (max-heap property))

     最大の要素は根に格納されており,ある接点を根とする部分木にはその節 点自身の値以下の値が含まれている

     min-ヒープ

     根以外の任意の接点i が A[PARENT(i)]≦A[i] を満たす

    (min-ヒープ条件 (min-heap property))

     最小の要素は根に格納される

    ヒープソートアルゴリズムではmax-ヒープを用いる

    minヒープは優先度付きキューでよく用いられる

    6.1 ヒープ (Heap)

  •  ヒープにおける節点の高さ  節点の高さは,その節点からある葉に下る最長の単純路に含まれる辺数

     ヒープの高さはその根の高さ (n要素のヒープは完全2分木に基づいているので,その高さはΘ(lgn))

    ヒープの基本演算は高々木の高さに比例する時間(O(lgn))で実行できること

    を後で証明する

    6.1 ヒープ (Heap)

    16

    14 10

    8 7 9 3

    2 4 1

    5

    1

    2 3

    4 6 7

    8 9 10

    ・・h=3

    ・・h=2

    ・・h=1

    ・・h=0

  • この章の残りの部分では,いくつかの基本的な手続きを紹介し,それらがソーティング アルゴリズムと優先度付きキューの中でどのように使われるかを示す

    手続き MAX-HEAPIFY:

    Maxヒープ条件を維持するためのキーとなる役割を果たす

    O(lgn)時間で動作する

    手続き BUILD-MAX-HEAP:

    順序がついていない入力の配列からmax-ヒープを構成する

    線形時間で動作する

    手続き HEAPSORT:

    配列をその場でソートする

    O(nlgn)時間で動作する

    手続き MAX-HEAP-INSERT, HEAP-EXTRACT-MAX, HEAP-INCREASE-KEY, HEAP-MAXIMUM:

    ヒープデータ構造を優先度付きキューとして用いる時に使用する

    いずれもO(lgn)時間で動作する

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-1

    高さ h のヒープの持つ要素数の最大と最小はいくつか.

    (解答)

    最大:

    2𝑛 ℎ

    𝑛=0

    = 2ℎ+1 − 1

    2 − 1 = 2ℎ+1 − 1

    最小:

    2𝑛 + 1

    ℎ−1

    𝑛=0

    = 2(ℎ−1)+1 − 1

    2 − 1 = 2ℎ − 1 + 1 = 2ℎ

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-2

    要素数が n のヒープの高さが ⌊𝑙𝑔𝑛⌋ となることを示せ.

    (解答)

    高さを h とすると,6.1-1 より,n 個の要素からなるヒープは

    2ℎ ≤ 𝑛 ≤ 2ℎ+1 − 1

    → 2ℎ ≤ 𝑛 ≤ 2ℎ+1 − 1 < 2ℎ+1

    を満たす.

    対数をとると,

    ℎ ≤ 𝑙𝑜𝑔𝑛 ≤ ℎ + 1

    したがって ℎ = ⌊𝑙𝑜𝑔𝑛⌋

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-3

    max-ヒープの部分木内の最大要素はその部分木の根になることを示せ.

    (解答)

    max-ヒープにおいては節点の値がその親の値以下であるmax-ヒープ条件が成立する ので自明である.

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-4

    すべての要素が異なるとき, max-ヒープ内の最小の要素はどこに置かれる可能性が あるか.

    (解答)

    最小の要素は子を持ち得ないので,必ず葉となる.

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-5

    既ソート配列は min-ヒープか.

    (解答)

    既ソート配列の先頭の要素は最小値であるから,min-ヒープの根となる.

    また,既ソート配列において,ある要素の値は,その後に続く要素の値より必ず大きくな るので,先頭以外の全ての要素がmin-ヒープ条件を満たす.

    したがって既ソート配列はmin-ヒープである.

    6.1 ヒープ (Heap)

  •  EXERCISE

    6.1-6

    数列 〈23,17,14,6,13,10,1,5,7,12〉 は max-ヒープか.

    (解答)

    A[4]=6

    A[RIGHT(4)]=A[9]=7>A[4]

    したがって max-ヒープ条件を満たさないため,

    この数列は max-ヒープではない

    6.1 ヒープ (Heap)

    23

    6

    14

    7

    13 10 1

    5

    17

    12

    5

    1

    2 3

    4 6 7

    8 9 10

  •  EXERCISE

    6.1-7

    要素数が n のヒープが格納されている配列において,葉の添字は

    ⌊𝑛/2⌋+1, ⌊𝑛/2⌋+2,…,n であることを示せ.

    (解答)

    以下を証明することで示す.

    (葉の数) =

    節点の数 + 1 ヒープが完全な二分木  ・・・①

    節点の数   ヒープの最後の要素の親が右の子を持たない  ・・・②

    ①のとき:

    節点の数が1である時

Recommended

View more >