1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Similar documents
2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

二分木ヒープとは 集合 リストから 最小な 要素を取り出す 二分木ヒープは そのための標準的データ構造 二分木ヒープを保存するデータ構造 二分木ヒープの操作のメソッド 対象となるデータクラス 識別のためのlabelフィールド 値を保持するvalueフィールド

JAVA とテンプレート

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

文字列操作と正規表現

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

グラフと組み合わせ 課題 7 ( 解答例 ) 2013/5/27 1 列挙 n 個の文字の集合 { } S = a, a,, an の全てからなる文字列 つまり同じ文字を含まない 長さ n の文字列を列挙する 方法を考える 1. 何通りの文字列があるかを答えなさい また そのことが正しい

CollectionsとLambda式

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

グラフの探索 JAVA での実装

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

ALG2012-A.ppt

Microsoft PowerPoint ppt

untitled

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

新・明解Java入門

アルゴリズムとデータ構造1

情報処理Ⅰ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

ALG ppt


untitled

Microsoft PowerPoint - kougi10.ppt

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Microsoft Word - NonGenTree.doc

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

明解Javaによるアルゴリズムとデータ構造

人工知能入門

明解Javaによるアルゴリズムとデータ構造

Microsoft Word - NonGenList.doc

Microsoft PowerPoint - prog03.ppt

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

解きながら学ぶJava入門編

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Microsoft PowerPoint - 05.pptx

Javaによるアルゴリズムとデータ構造

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

Java講座

Microsoft PowerPoint - 06.pptx

JavaプログラミングⅠ

ALG2012-C.ppt

r1.dvi

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

K227 Java 2

2

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

2

プログラミング基礎I(再)

プログラミング入門1

ALG ppt

グラフを表すデータ構造 Javaでの実装

Java演習(4) -- 変数と型 --

基本情報STEP UP演習Java対策

Program Design (プログラム設計)

プログラミング入門1

: : : TSTank 2

新・明解Javaで学ぶアルゴリズムとデータ構造

問題1 以下に示すプログラムは、次の処理をするプログラムである

2

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

Microsoft Word - no206.docx

JAVA入門

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft PowerPoint - chap10_OOP.ppt

新・明解Javaで学ぶアルゴリズムとデータ構造

Microsoft PowerPoint - OOP.pptx

デジタル表現論・第4回

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

8 if switch for while do while 2

PowerPoint プレゼンテーション

離散数学

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

PowerPoint プレゼンテーション

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

PowerPoint Presentation

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Prog1_15th

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

DVIOUT-interface-he

JavaプログラミングⅠ

JAVA入門

untitled

DVIOUT-exer

Microsoft Word - keisankigairon.ch doc

Java (7) Lesson = (1) 1 m 3 /s m 2 5 m 2 4 m 2 1 m 3 m 1 m 0.5 m 3 /ms 0.3 m 3 /ms 0.6 m 3 /ms 1 1 3

スライド 1

アルゴリズムとデータ構造1

メソッドのまとめ

Microsoft Word - CompA-Ex doc

微分方程式 モデリングとシミュレーション

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

オブジェクト指向プログラミング・同演習 5月21日演習課題

GEC-Java


Transcription:

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値 O. value を持つ とする このようなオブジェクトを保存する二分木ヒープについて考える 二分木ヒープは以下の二つの制約のある二分木である 1. ある頂点のオブジェクトの値は その子の頂点の値よりも小さいか等しい 2. 完全二分木であること つまり 最下層以外の第 k 層には 2 k 1 個の頂点があり 最下層のみ 左から詰めてあること 上記の 1 より この二分木は半順序木となる 3 0.1 1 12 0.2 2 9 3 0.1 13 0.5 10 4 8 4 5 6 7 0.3 0.2 0.4 1 0.6 2 0.9 11 0.8 5 0.4 7 0.3 8 9 10 11 12 Figure 1 二分木ヒープの例 例の中で 各頂点の右の番号を位置と呼ぶことにする 根を 1 番とし 第 k 層の頂点を左から 2 k 番から順番に番号を付けることとする このような番号を付けることで ある頂点 i の親の番号は i /2 であること その子の番号は 2i 及び 2i + 1であることが分かる

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正しい位置に移動させる この操作をシフトアップと呼ぶことにする void add(o o){ int ; ; shiftup( ); ; ある位置 k に居る要素が 親の位置 k /2 にある要素よりも小さいならば 二つの要素を入れ替える必要がある この操作を繰り返すことで 追加した要素を正しい位置に配置する シフトアップのアルゴリズムは 以下のようになる void shiftup(int ){ if( && isless(, )){ swap(, ); ; shiftup( ); ここで isless( i, j ) は oi. value < o j. value のとき真となるメソッド swap( i, j ) は o i と o の位置を入れ替えるメソッドである 3.2. 最小要素の取出しヒープの目的は 最小要素を見つけることである 最小要素は 根として保存されている この根を取り除くと ヒープとしての制限を満たさない そこで 最小要素を取り除 j

いた後 以下のような手順でヒープを再構築する O poll(){ O ; O ; ; shiftdown(1); return ; 最小要素 つまり木の根を取り除いた後 リストの最後の要素を仮に根の位置に置く こうすることで 木が完全であることが復元される その後 この要素を下向きに移動させ 適切な位置に配置する この操作をシフトダウンと呼ぶことにする ある位置 k に居る要素の値が その子の位置 2k または 2k + 1に居る要素の小さいほうよりも大きい場合に その小さいほうの要素と入れ替える操作をシフトダウンと呼ぶ これにより ヒープであることが復元される シフトダウンのアルゴリズムは以下のようになる void shiftdown(int ){ int ; if( ){ int ; if( && isless( )) ; if(isless( ))return; swap( ); shiftdown( );

貪欲アルゴリズム (GREEDY ALGORITHM, KRUSKAL ALGORITHM) T H :G の弧の重みに関するヒープ while ( T はG の極大木ではない ) { a H.poll() anew null a null ){ ヒープから最小要素を取得 while( new if ( T { a は閉路を持たない ) { a new T T {a new a

package utils; import java.text.numberformat; import java.util.arraylist; import java.util.collections; import java.util.comparator; import java.util.list; * * @author tadaki public class BinaryHeap<T> { データを保持するリスト private List<T> list; 要素を比較する方法 private Comparator<T> comparator = null; 要素数 private int n; * コンストラクタ : 比較方法を指定する場合 * 比較方法を指定しない場合は * 要素はインターフェイス Comparable を実装していること * @param comparator public BinaryHeap(Comparator<T> comparator) { this(); this.comparator = comparator; public BinaryHeap() { list = Collections.synchronizedList(new ArrayList<T>()); list.add(null ); n = 0; * 新しい要素を追加する * @param t * @return public boolean add(t t) { 1/6 ページ

boolean b = list.add(t); if (b) { n++; shiftup(n); return b; * 最小の要素を得る : 削除しない * @return public T peek() { if (n == 0) { return null; return list.get(1); * 最小の要素を取り出し 削除する * @return public T poll() { T t = null; if (n == 0) { return null; if (n == 1) {// 残りの要素が一つ t = list.remove(n); n--; else { T x = list.remove(n); t = list.get(1); n--; list.set(1, x); shiftdown(1); return t; * 特定の要素の値を小さくした場合の再配置 * @param t 2/6 ページ

public void reducevalue(t t) { int k = list.indexof(t); shiftup(k); * リストの取得 * @return public List<T> getlist() { return list; public boolean isempty() { return (n == 0); ***************************************************************** * ある k にある object を上位の適切な位置に置く * @param k private void shiftup(int k) { if (k > 1 && isless(k, (int) (k / 2))) { int j = (int) (k / 2); swap(k, j); shiftup(j); * ある k にある object を下位の適切な位置に置く * @param k private void shiftdown(int k) { if (2 * k <= n) { int j = 2 * k; if (j < n && isless(j + 1, j)) { j++; if (isless(k, j)) { return; 3/6 ページ

swap(k, j); shiftdown(j); private boolean isless(int i, int j) { int a = 0; if (comparator == null && list.get(i) instanceof Comparable) { Comparable x = (Comparable) list.get(i); Comparable y = (Comparable) list.get(j); a = x.compareto(y); else { a = comparator.compare(list.get(i), list.get(j)); return (a < 0); private void swap(int i, int j) { T o = list.get(i); list.set(i, list.get(j)); list.set(j, o); ***************************************************************** * @param args the command line arguments public static void main(string[] args) { サンプルとなるデータオブジェクト class Data { 4/6 ページ int label; double value; public Data(int label, double value) { this.label = label; this.value = value; サンプルとなるデータの比較方法 class CompareData implements Comparator<Data> {

5/6 ページ public int compare(data o1, Data o2) { int a = 0; if (o1.value > o2.value) { a = 1; if (o1.value < o2.value) { a = -1; return a; BinaryHeap<Data> h = new BinaryHeap(new CompareData()); データ追加 int n = 20; for (int i = 0; i < n; i++) { Data d = new Data(i + 1, Math.random()); h.add(d); 結果取得 List<Data> list = h.getlist(); 最小値を削除 for (int i = 0; i < 2; i++) { Data d = h.poll(); n--; 出力 NumberFormat format = NumberFormat.getInstance(); format.setmaximumfractiondigits(4); int l = (int) (Math.log((double) n) / Math.log(2.) + 0.1); for (int i = 0; i <= l; i++) { int m = (int) (Math.pow(2., (double) i) + 0.1); System.out.println(); for (int j = 0; j < m; j++) { int k = m + j; if (k!= 0 && k <= n) { System.out.print("(" ); System.out.print(list.get(k).label); System.out.print("," ); System.out.print(format.format(list.get(k).value)); System.out.print(") " );

System.out.println(); 6/6 ページ