アルゴリズムとデータ構造 第8回 ソート(3).

Slides:



Advertisements
Similar presentations
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
Advertisements

4.3 マージソート.
離散システム特論 整列(sorting)アルゴリズム 2.
ヒープソートの演習 第13回.
第12回 ソート(3): シェルソート、クイックソート
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
2009/10/30 整列アルゴリズム (2) 第5講: 平成21年10月30日 (金) 4限 E252教室 コンピュータアルゴリズム.
On the Enumeration of Colored Trees
Problem G : Entangled Tree
プロセッシング入門3 初歩のプログラミング.
アルゴリズムとデータ構造 第6回演習解答 2015/11/18実施 アルゴリズムとデータ構造 2015.
第10回 ソート(1):単純なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
ヒープソートの復習.
階層的境界ボリュームを用いた 陰関数曲面の高速なレイトレーシング法
アルゴリズムとデータ構造 2011年6月14日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
第11回 整列 ~ シェルソート,クイックソート ~
二分探索木によるサーチ.
“Purely Functional Data Structures” セミナー
アルゴリズムとデータ構造1 2006年6月16日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2005年7月15日
ソートアルゴリズムの種類 選択ソート (selection sort) バブルソート (bubble sort)
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2005年7月1日
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとプログラミング (Algorithms and Programming)
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造1 2006年7月11日
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとプログラミング (Algorithms and Programming)
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
第9回 優先度つき待ち行列,ヒープ,二分探索木
ハフマン符号長の効率的な求め方.
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2011年6月16日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 2013年7月2日
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
平面走査法を使った 一般線分の 交点列挙アルゴリズム
ヒープソート.
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
参考:大きい要素の処理.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

アルゴリズムとデータ構造 第8回 ソート(3)

本日の講義内容 heap 配列によるheap heap sort

heap 2分木で、そのノードが必ず子の値以上になっているものをheapという。heapでは、そのrootは必ず全体の最大値となっている。

配列によるheap 配列a[]の第0を、rootとみなす。 その子は1,2であり、1の子は3,4 2の子は 5,6, その子は1,2であり、1の子は3,4 2の子は 5,6, 3の子は7,8 4の子は9,10 5の子は11,12 6の子は13,14 ............. このようにして、配列を2分木とみなすことができる。

親子のindexの関係 親a[i]の 左の子=a[i*2+1] 右の子=a[i*2+2] 子a[i]の親は a[(i-1)/2] である。. この関係を使うと、1個の配列を2分木とみなす ことがいつでもできる。

例 a[10]の内容が 10 8 7 6 5 4 2 3 1 3 はheapである。(確認せよ!) 10 8 7 6 5 4 2 3 1 3 はheapである。(確認せよ!) 先頭がroot, その後の2個がlevel 1, 4個がlevel 2, 8個がlevel3,... となっている。 

heap化 配列aの位置nから下の部分木を考える。 位置nのデータ以外の下方にあるデータは すでにheapであるとする。これを、heapにするには位置nのデータを子供たちの値と比較して データを交換しながら下にたどっていけばよい。 これを実行する関数を void downheap(int a[],int n,int right) とする。ただし、rightはheap化する範囲の 右端とする。

downheapのアルゴリズム 1. a[n]の子をnl, nrとしよう。 2. nl>rightならば終了 3. nr>rightのときは(nl==rightである) a[n]>=a[nl]なら終了 a[n]<a[nl]なら交換して終了 4. a[nl]<a[nr]ならc=nr そうでなければc=nlとする。 5. a[n]>=a[c]ならば終了 そうでなければa[n],a[c]を交換して n=cにして手順1に戻る。 

配列をheap化する 配列a[]の大きさをsize, right=size-1とする。 rightの親をnとする。 このとき、nの右側の要素はすべて子を持たないから葉になっている。つまり、nより下の木は そのままheapである。 従って、downheap(a,n,right)を呼び出して n以下をheapにする。 以下、nを減らして0まで繰り返し downheapを実行すれば、配列全体がheap になる。  

heap sortアルゴリズム 1. a[]を前の手順でheap化する。 2. このときa[0]が全体の最大値となっているので、a[0]とa[right]を入れ替える。 3. rightは確定したので、righを1減らす。 4. a[0]以外は、heapなので downheap(a,0,right)を実行する。 5. right>0ならば、手順2に戻る。 

heap sortの速度 heapの再構成は、2分木をたどっていくので O(log n)回の比較と交換ですむ。 これが、n回行われるのでたかだかO(n log n) ですむ。 最初に行う配列全体のheap化は n=2^kとすると 2^(k-1)+2*2^(k-2)+3*2^(k-3)+..... <= k2^(k-1)=n/2 log n となるので 結局 O(n log n)の速度である。 

heap sortの特徴 最大値を求めて、交換を繰り返すので選択ソートの高速版ともいえる。 アルゴリズムは、やや複雑だが美しい。 作業領域を必要としない。 安定ではない。