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

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

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

JAVA とテンプレート

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

文字列操作と正規表現

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

CollectionsとLambda式

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

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

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

グラフの探索 JAVA での実装

Microsoft PowerPoint ppt

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

新・明解Java入門

デジタル表現論・第4回

Microsoft Word - NonGenTree.doc

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

メソッドのまとめ

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

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

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

人工知能入門

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

Microsoft Word - NonGenList.doc

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

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - chap10_OOP.ppt

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

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

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


untitled

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

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

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

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

Microsoft PowerPoint - kougi10.ppt

JavaプログラミングⅠ

ALG2012-A.ppt

PowerPoint プレゼンテーション

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

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

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

Program Design (プログラム設計)

プログラミング入門1

Java講座

2

K227 Java 2

ALG ppt

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

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

untitled

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

ALG2012-C.ppt

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

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

2

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

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

基本情報STEP UP演習Java対策

プログラミングA

Javaプログラムの実行手順

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

ALG ppt

GEC-Java

Microsoft PowerPoint - 06.pptx

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

プログラミング入門1

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

2

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

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

r1.dvi

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

解きながら学ぶJava入門編

Microsoft PowerPoint - lec06 [互換モード]

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

PowerPoint プレゼンテーション

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

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

明解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セキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

ユニット・テストの概要

Microsoft PowerPoint - prog04.ppt

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

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

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

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

スライド 1

PowerPoint プレゼンテーション

JavaプログラミングⅠ

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

JAVA入門

DVIOUT-exer


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

Prog2_9th

プログラミング入門1

Transcription:

二分木ヒープ (BINARY HEAP)

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

二分木ヒープとは どういう二分木か ある頂点の要素 pのvalueは その子 cの要素のvalueより大きくない p. value c. value 半順序木になっている 完全二分木である 最下層以外の第 k 層には 2 k-1 個の頂点がある 最下層は 左から詰めて頂点がある

label value 3 0.1 1 位置 9 0.1 2 12 3 4 10 7 6 4 5 6 7 0.3 0.3 0.5 2 0.9 8 5 11 0.8 1 0.6 8 9 10 11 12

3 0.1 9 0.1 12 4 10 0.3 7 0.3 6 0.5 2 0.9 8 5 11 0.8 1 0.6

二分木ヒープを保持するデータ構造 リストで保持 0 番 : 空 ( リストのインデクスが 1 から始まるプログラミング言語では不要 ) 1 番 : 根の要素 2 k 番 : 第 k 層の左端の要素

親子の番号の関係 親の番号 子の番号 i /2 i i 2i 2i + 1

要素の追加 リストの終端に要素を追加する 木の最下層の一番右に追加 または新たな層を作って その左端に追加 void add(o o){ int n = L ; L.append( o ) ; n ++; shiftup( n );

要素の追加 : シフトアップ 追加した新要素を正しい位置へ移動 位置 kの要素が 親の位置 k /2 の要素よりも小さいならば 二つの要素を入れ替える void shiftup(int k ){ k > && isless( k, k /2 )){ if( 1 swap( k, k /2 ); k = k /2 ; isless(i,j) o. value < o. value i j のとき真 swap(i,j): 要素入れ替え shiftup( k );

3 0.1 1 9 0.1 2 12 3 4 10 7 6 4 5 6 7 0.3 0.3 0.5 2 0.9 8 5 11 0.8 1 0.6 13 新要素を末尾に追加 8 9 10 11 12 13

3 0.1 1 9 0.1 2 12 3 4 10 13 6 4 5 6 7 0.3 0.5 要素入れ替え 2 0.9 8 5 11 0.8 1 0.6 7 0.3 8 9 10 11 12 13

1 0.6 1 0.6 2 0.9 2

1 0.6 2 0.9 3 0.1 3 0.1 2 0.9 1 0.6

3 0.1 2 0.9 1 0.6 4 Swap 3 0.1 4 1 0.6 2 0.9

3 0.1 4 1 0.6 2 0.9 5

3 0.1 4 15 0.6 0.5 2 0.9 5 61 0.5 0.6 Swap

3 0.1 4 76 0.3 0.5 Swap 2 0.9 5 1 0.6 76 0.3 0.5

3 0.1 4 7 0.3 28 0.9 5 1 0.6 6 0.5 82 0.9 Swap

最小要素の取出し 最小要素は木の根として保存されている 最小要素を取り除き 再構築する 最小要素の取り除き : リスト中の1 番が空く 最後尾の要素を取り除き リストの1 番に入れる 適切な位置へシフトダウンする O poll(){ t = L.get(1) ; x L.removeLast() L.set(1, x ) ; O O = ; shiftdown(1); return t ;

要素の取出し : シフトダウン 追加した新要素を正しい位置へ移動 位置 k の要素が 子の要素の位置 2k と 2k+1 の小さいほうの値より大きい場合 その小さい値の子を入れ替える

要素の取出し : シフトダウン void shiftdown(int k ){ int n = L ; if( 2 k n){ int j 2 if( j = k ; < n && isless( j+ 1, j)) j ++; if(isless( k, j ))return; swap( k, j ); shiftdown( j );

3 0.1 Root の取出し 9 0.1 12 4 10 0.3 13 6 0.5 2 0.9 8 5 11 0.8 1 0.6 7 0.3

7 0.3 9 0.1 12 4 10 0.3 13 6 0.5 2 0.9 8 5 11 0.8 1 0.6 7 0.3 Root へ移動

7 0.3 9 0.1 Swap 12 4 10 0.3 13 6 0.5 2 0.9 8 5 11 0.8 1 0.6

9 0.1 7 0.3 12 Swap 4 10 0.3 13 6 0.5 2 0.9 8 5 11 0.8 1 0.6

9 4 12 7 0.3 10 0.3 13 6 0.5 2 0.9 8 5 11 0.8 1 0.6

特定の要素の値を小さくする その要素のインデクス k shiftup を k を起点に実施 void reducevalue(o o){ k = o のリスト中のインデクス shiftup(k)

特定の要素の値を大きくする その要素のインデクス k shiftdown を k を起点に実施 void raisevalue(o o){ k = o のリスト中のインデクス shiftdown(k)

単体テスト プログラムのテスト技法のひとつ 関数やメソッドが正しく動作していることを確認する 関数の実際の戻り値と想定される戻り値を比較する NetBeans には 単体テストの自動生成機能がある プロジェクトウィンドウで 対象となるクラスをマウス右ボタンで選択 ツール Junitテストを生成 テストツールJunitを使うことで メソッドが正しく動作していることをテストする

assertequals メソッド 二つの引数 ( メソッド実行結果と期待される結果 ) が等しいかを判別する asserttrue メソッド 引数が true であるかを判別する assertfalse メソッド assertnull メソッド 引数が null であるかを判別する

BinaryHeap.java 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 ページ

BinaryHeap.java 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 t; 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 ページ

BinaryHeap.java public void reducevalue(t t) { int k = list.indexof(t); shiftup(k); * 特定の要素の値を大きくした場合の再配置 * @param t public void raisevalue(t t){ int k = list.indexof(t); shiftdown(k); * リストの取得 * @return public List<T> getlist() { return list; public boolean isempty() { return (n == 0); public boolean contains(t t) { return list.contains(t); ***************************************************************** * ある 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); 3/6 ページ

BinaryHeap.java * ある 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; swap(k, j); shiftdown(j); @SuppressWarnings("unchecked") private boolean isless(int i, int j) { int a; T x = list.get(i); T y = list.get(j); if (comparator == null && x instanceof Comparable && y instanceof Comparable) { a = ((Comparable) x).compareto((comparable) y); else { a = comparator.compare(x, y); 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 4/6 ページ

BinaryHeap.java public static void main(string[] args) { サンプルとなるデータオブジェクト class Data { 5/6 ページ int label; double value; public Data(int label, double value) { this.label = label; this.value = value; サンプルとなるデータの比較方法 class CompareData implements Comparator<Data> { @Override 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();

BinaryHeap.java 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 ページ

BinaryHeapTest.java package utils; import java.util.arraylist; import java.util.comparator; import java.util.list; import static org.junit.assert.*; import org.junit.*; * * @author tadaki public class BinaryHeapTest { * ヒープに保存するデータの型 class Data { int label; int value; public Data(int label, int value) { this.label = label; this.value = value; public void setvalue(int value) { this.value = value; public Data(final Data d) { this(d.label, d.value); * クラス Data のインスタンスの比較方法 class CompareData implements Comparator<Data> { 1/6 ページ public int compare(data o1, Data o2) { int a = 0; if (o1.value > o2.value) {

BinaryHeapTest.java a = 1; if (o1.value < o2.value) { a = -1; return a; * 入力データ列 List<Data> datalistoriginal; * 入力データ列 List<Data> datalist; * 完全に並べられたデータ列 List<Data> orderedlist; * 完全に並べられたデータ列 public BinaryHeapTest() { @BeforeClass public static void setupclass() throws Exception { @AfterClass public static void teardownclass() throws Exception { @Before public void setup() { * 入力作成 int data[] = {4, 5, 2, 6, 3, 1, 0, 9; datalistoriginal = new ArrayList<>(); for (int i = 0; i < data.length; i++) { Data d = new Data(i, data[i]); 2/6 ページ

BinaryHeapTest.java datalistoriginal.add(d); @After public void teardown() { private void printdata(list<data> list) { for (Data d : list) { System.out.print(d.value); System.out.print(" "); System.out.println(); private void mktestdata(binaryheap h) { datalist = new ArrayList<>(); for (Data d : datalistoriginal) { datalist.add(new Data(d)); for (int i = 0; i < datalist.size(); i++) { Data d = datalist.get(i); h.add(d); * 出力作成 orderedlist = new ArrayList<>(); orderedlist.add(datalist.get(6)); orderedlist.add(datalist.get(5)); orderedlist.add(datalist.get(2)); orderedlist.add(datalist.get(4)); orderedlist.add(datalist.get(0)); orderedlist.add(datalist.get(1)); orderedlist.add(datalist.get(3)); orderedlist.add(datalist.get(7)); * Test of add method, of class BinaryHeap. @Test public void testadd() { 3/6 ページ

BinaryHeapTest.java System.out.println("add"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data t = datalist.get(0); boolean result = instance.add(t); asserttrue(result); * Test of peek method, of class BinaryHeap. @Test public void testpeek() { System.out.println("peek"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data expresult = datalist.get(6); Data result = instance.peek(); assertequals(expresult, result); * Test of peek method for null data, of class BinaryHeap. @Test public void testpeekfornull() { System.out.println("peek for null"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); Data result = instance.peek(); assertnull(result); * Test of poll method, of class BinaryHeap. @Test public void testpoll() { System.out.println("poll"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data expresult = datalist.get(6); Data result = instance.poll(); assertequals(expresult, result); 4/6 ページ

BinaryHeapTest.java * Test of poll method, of class BinaryHeap. @Test public void testpollandpeek() { System.out.println("poll And Peek"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data expresult = datalist.get(5); Data result0 = instance.poll(); Data result = instance.peek(); assertequals(expresult, result); * Test of reducevalue method, of class BinaryHeap. @Test public void testreducevalue() { System.out.println("reduceValue"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data t = datalist.get(0); t.value = -1; instance.reducevalue(t); Data expresult = datalist.get(0); Data result = instance.peek(); assertequals(expresult, result); * Test of raosevalue method, of class BinaryHeap. @Test public void testraisevalue() { System.out.println("raiseValue"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); Data t = datalist.get(5); t.value = 7; instance.reducevalue(t); Data expresult = t; Data result = instance.getlist().get(3); assertequals(expresult, result); 5/6 ページ

BinaryHeapTest.java @Test public void testsort() { System.out.println("Sort"); BinaryHeap<Data> instance = new BinaryHeap(new CompareData()); mktestdata(instance); List<Data> result = new ArrayList<>(); while (!instance.isempty()) { Data d = instance.poll(); result.add(d); assertequals(orderedlist, result); 6/6 ページ