INTRODUCTION TO ALGORITHMS

Size: px
Start display at page:

Download "INTRODUCTION TO ALGORITHMS"

Transcription

1 関根渓 ( 情報知識ネットワーク研究室 B4) INTRODUCTION TO LGORITHMS 6. Heapsort

2 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

3 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

4 6. ヒープ (Heap) (2 分木 ) ヒープ ((binary)heap) データ構造とは, 下図に示すようなおおよそ完全 2 分木と見なすことができる配列のこと 木の各節点は, その節点の値を格納している配列の要素に対応

5 6. ヒープ (Heap) ヒープを表す配列が持つ 2 つの属性 length[] 配列 の要素数 heap-size[] 配列 に含まれているヒープの要素数 すなわち,[ length[]] には正しい要素が含まれているが,[heap-size[]] を超える要素はどれもヒープの要素ではない ただし,heap-size[] length[]

6 6. ヒープ (Heap) 木の根は [] であり, 節点の添字 i が与えられたとき, その親 PRENT(i), 左の子 LEFT(i), 右の子 RIGHT(i) は簡単に計算できる PRENT(i) LEFT(i) return i/2 return 2i RIGHT(i) return 2i +

7 6. ヒープ (Heap) 大抵の計算機では LEFT: i の 2 進表現を ビット左にシフトすることで 2i を計算 RIGHT: i の 2 進表現を ビット左にシフトしたあと, 最下位ビットを にすることで 2i+ を計算 PRENT: i の 2 進表現を ビット右にシフトすることで i/2 を計算

8 6. ヒープ (Heap) 大抵の計算機では LEFT: i の 2 進表現を ビット左にシフトすることで 2i を計算 RIGHT: i の 2 進表現を ビット左にシフトしたあと, 最下位ビットを にすることで 2i+ を計算 PRENT: i の 2 進表現を ビット右にシフトすることで i/2 を計算 ヒープソートのうまい手続きでは, これら 3 つの手続きはしばしば マクロ または インライン 手続きとして実現される

9 6. ヒープ (Heap) 2 分木ヒープの種類 どちらもヒープ条件 (heap property) を満たす max- ヒープ 根以外の任意の節点 i が [PRENT(i)] [i] を満たす (max- ヒープ条件 (max-heap property)) 最大の要素は根に格納されており, ある接点を根とする部分木にはその節点自身の値以下の値が含まれている min- ヒープ 根以外の任意の接点 i が [PRENT(i)] [i] を満たす (min-ヒープ条件 (min-heap property)) 最小の要素は根に格納される ヒープソートアルゴリズムでは max- ヒープを用いる min ヒープは優先度付きキューでよく用いられる

10 6. ヒープ (Heap) ヒープにおける節点の高さ 節点の高さは, その節点からある葉に下る最長の単純路に含まれる辺数 ヒープの高さはその根の高さ (n 要素のヒープは完全 2 分木に基づいているので, その高さは Θ(lgn)) h=3 h=2 h= h=0 ヒープの基本演算は高々木の高さに比例する時間 (O(lgn)) で実行できることを後で証明する

11 6. ヒープ (Heap) この章の残りの部分では, いくつかの基本的な手続きを紹介し, それらがソーティングアルゴリズムと優先度付きキューの中でどのように使われるかを示す 手続き MX-HEPIFY: Max ヒープ条件を維持するためのキーとなる役割を果たす O(lgn) 時間で動作する 手続き BUILD-MX-HEP: 順序がついていない入力の配列から max- ヒープを構成する線形時間で動作する 手続き HEPSORT: 配列をその場でソートする O(nlgn) 時間で動作する 手続き MX-HEP-INSERT, HEP-EXTRCT-MX, HEP-INCRESE-KEY, HEP-MXIMUM: ヒープデータ構造を優先度付きキューとして用いる時に使用するいずれも O(lgn) 時間で動作する

12 6. ヒープ (Heap) EXERCISE 6.- 高さ h のヒープの持つ要素数の最大と最小はいくつか. ( 解答 ) 最大 : h n=0 2 n = 2h+ 2 = 2h+ 最小 : h n=0 2 n + = 2(h )+ 2 = 2 h + = 2 h

13 6. ヒープ (Heap) EXERCISE 6.-2 要素数が n のヒープの高さが lgn となることを示せ. ( 解答 ) 高さを h とすると,6.- より,n 個の要素からなるヒープは 2 h n 2 h+ 2 h n 2 h+ < 2 h+ を満たす. 対数をとると, h logn h + したがって h = logn

14 6. ヒープ (Heap) EXERCISE 6.-3 max- ヒープの部分木内の最大要素はその部分木の根になることを示せ. ( 解答 ) max- ヒープにおいては節点の値がその親の値以下である max- ヒープ条件が成立するので自明である.

15 6. ヒープ (Heap) EXERCISE 6.-4 すべての要素が異なるとき, max- ヒープ内の最小の要素はどこに置かれる可能性があるか. ( 解答 ) 最小の要素は子を持ち得ないので, 必ず葉となる.

16 6. ヒープ (Heap) EXERCISE 6.-5 既ソート配列は min- ヒープか. ( 解答 ) 既ソート配列の先頭の要素は最小値であるから,min- ヒープの根となる. また, 既ソート配列において, ある要素の値は, その後に続く要素の値より必ず大きくなるので, 先頭以外の全ての要素が min- ヒープ条件を満たす. したがって既ソート配列は min- ヒープである.

17 6. ヒープ (Heap) EXERCISE 6.-6 数列 23,7,4,6,3,0,,5,7,2 は max- ヒープか. ( 解答 ) [4]=6 [RIGHT(4)]=[9]=7>[4] したがって max-ヒープ条件を満たさないため, この数列は max-ヒープではない

18 6. ヒープ (Heap) EXERCISE 6.-7 要素数が n のヒープが格納されている配列において, 葉の添字は n/2 +, n/2 +2,,n であることを示せ. ( 解答 ) 以下を証明することで示す. ( 葉の数 ) = 節点の数 + ヒープが完全な二分木 節点の数ヒープの最後の要素の親が右の子を持たない 2 のとき : 節点の数がである時, 左図より ( 節点の数 )= ( 葉の数 )=2 となり, 仮定が成り立つ

19 6. ヒープ (Heap) EXERCISE 節点の数が k 個のとき仮定が成り立つとすると, 葉の数は k+ である. さらに葉を 2 個追加して, ヒープを再び完全な二分木とすると, 下図より葉が節点となり, その子として葉が 2 個増えることになるので, ( 節点の個数 )= k+ ( 葉の個数 ) = (k+)+ となって仮定が成り立つ.

20 6. ヒープ (Heap) EXERCISE 2のとき : 節点の数がである時, 右図より ( 節点の数 )= ( 葉の数 )= となり, 仮定が成り立つ 2 節点の数が k 個のとき仮定が成り立つとすると, 葉の数は k である. さらに葉を 2 個追加すると, 図 ( 次ページ ) より葉が節点となり, さらに葉が 2 個増えるので ( 節点と葉が 個ずつ増える ), ( 節点の個数 )= k+ ( 葉の個数 ) = k+ となって仮定が成り立つ. よって,2 より仮定が成り立つことが示され, これは暗に葉の添字が n/2 +, n/2 +2,,n であることを示している.

21 6. ヒープ (Heap) EXERCISE

22 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

23 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY 入力は配列 と配列の添字 i 添字 i を根とする部分木が max- ヒープになるように [i] の値を max- ヒープの中に 滑り落とす この手続きが呼ばれるとき,LEFT(i) と RIGHT(i) を根とする二分木が max-ヒープであることを仮定する アルゴリズム MX-HEPIFY(,i) l LEFT(i) 2 r RIGHT(i) 3 if l heap-size[] かつ [l]>[i] 4 then largest l 5 else largest i 6 if r heap-size[] かつ [r] > [largest] 7 then largest r 8 if largest i 9 then exchange [i] [largest] 0 MX-HEPIFY(,largest) Line -2 節点 i の左の子のインデックスを l に, 右の子のインデックスを r に代入

24 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY 入力は配列 と配列の添字 i 添字 i を根とする部分木が max- ヒープになるように [i] の値を max- ヒープの中に 滑り落とす この手続きが呼ばれるとき,LEFT(i) と RIGHT(i) を根とする二分木 Line 3-5 if 文が max-ヒープであることを仮定する アルゴリズム MX-HEPIFY(,i) l LEFT(i) 2 r RIGHT(i) 3 if l heap-size[] かつ [l]>[i] 4 then largest l 5 else largest i 6 if r heap-size[] かつ [r] > [largest] 7 then largest r 8 if largest i 9 then exchange [i] [largest] 0 MX-HEPIFY(,largest) 節点 i が左の子を持ち, かつ節点 i の値より左の子の値のほうが大きければ, largest に左の子のインデックスを代入するそうでなければ largest に i を代入

25 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY 入力は配列 と配列の添字 i 添字 iを根とする部分木が max-ヒープになるように [i] の値をmax- ヒープの中に 滑り落とす この手続きが呼ばれるとき節点,LEFT(i) iが右の子を持ちと RIGHT(i), を根とする二分木が max-ヒープであることを仮定する アルゴリズム MX-HEPIFY(,i) l LEFT(i) 2 r RIGHT(i) 3 if l heap-size[] かつ [l]>[i] 4 then largest l 5 else largest i 6 if r heap-size[] かつ [r] > [largest] 7 then largest r 8 if largest i 9 then exchange [i] [largest] 0 MX-HEPIFY(,largest) Line 6-7 if 文 かつインデックスがlargestである節点の値より右の子の値のほうが大きければ, largestに右の子のインデックスを代入する

26 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY 入力は配列 と配列の添字 i 添字 iを根とする部分木が max-ヒープになるように [i] の値をmax- ヒープの中に 滑り落とす Line 8-0 if 文 この手続きが呼ばれるとき点でなければ,LEFT(i) と, RIGHT(i) を根とする二分木が max-ヒープであることを仮定する アルゴリズム MX-HEPIFY(,i) l LEFT(i) 2 r RIGHT(i) 3 if l heap-size[] かつ [l]>[i] 4 then largest l 5 else largest i 6 if r heap-size[] かつ [r] > [largest] 7 then largest r 8 if largest i 9 then exchange [i] [largest] 0 MX-HEPIFY(,largest) 節点 i が最大値 ( 右の子, 左の子の値と比べたとき ) を持つ節 [i] と [largest] を交換し, 今度は[largest] に対してMX-HEPIFYを実行する

27 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) heap-size[]=

28 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [2]=4 [LEFT(2)]=[4]=4 [RIGHT(2)]=[5]=4 最大値は [4]=4 i heap-size[]=

29 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [2]=4 [LEFT(2)]=[4]=4 [RIGHT(2)]=[5]=4 最大値は [4]=4 [2] と [4] を交換 次は i=4 として MX-HEPIFY を実行 heap-size[]= i

30 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [4]=4 [LEFT(4)]=[8]=2 [RIGHT(4)]=[9]=8 最大値は [9]= heap-size[]=0 i

31 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [4]=4 [LEFT(4)]=[8]=2 [RIGHT(4)]=[9]=8 最大値は [9]=8 [4] と [9] を交換 次は i=9 として MX-HEPIFY を実行 heap-size[]= i 4

32 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [9]=4 LEFT(9)=8>heap-size[] RIGHT(9)=9>heap-size[] したがって処理が終了 heap-size[]= i 4

33 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY ( MX-HEPIFY(,2) の動作 ) [9]=4 LEFT(9)=8>heap-size[] RIGHT(9)=9>heap-size[] したがって処理が終了 heap-size[]= 確かに添字 i=2 を根とする部分木が max- ヒープになっている

34 6.2 ヒープ条件の維持 (Maintaining the heap property) 手続き MX-HEPIFY 実行時間の吟味 ] MX-HEPIFY の実行時間は, [i],[left(i)],[right(i)] の間の関係を比較するための Θ() 時間と, 節点 i のどちらかの子を根とする部分木に対する MX-HEPIFY の実行時間との合計である i どちらの子の部分木のサイズも高々 2n/3 ( 左図のように木の最下行が半分だけ埋まっている場合 ) だから,MX-HEPIFY の実行時間は漸化式 T(n) T(2n/3) + Θ() で表現できる したがって,T(n) = O(lgn) である 高さ h の節点に対する MX-HEPIFY の実行時間は O(h) であると言える

35 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE 6.2- 図 6.2 を参考にして, 配列 = 27,7,3,6,3,0,,5,7,2,4,8,9,0 に対する MX- HEPIFY の動作を示せ. ( 解答 ) 希望があればホワイトボードで

36 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE 手続き MX-HEPIFY を利用して,min- ヒープ上で MX-HEPIFY に対応する操作を実現する手続き MX-HEPIFY の擬似コードを書け. MX-HEPIFY の実行時間を MX-HEPIFY と比較せよ ( 解答 ) MIN-HEPIFY(,i) l LEFT(i) 2 r RIGHT(i) 3 if l heap-size[] ND [l] < [i] 4 then smallest l 5 else smallest i 6 if r heap-size[] ND [r] < [largest] 7 then smallest r 8 if largest i 9 then exchange [i] [smallest] 0 MIN-HEPIFY(,smallest) 実行に要する時間は MX-HEPIFY と変わらない

37 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE 要素 [i] が両方の子より大きいとき,MX-HEPIFY(,i) の呼び出しはどのような効果があるか. ( 解答 ) 何も行われずに終了する CIRQUE05 は MX-HEPIFY(,) を呼び出した! しかし なにもおこらなかった!

38 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE i > heap-size[]/2 のとき,MX-HEPIFY(,) の呼び出しはどのような効果があるか. ( 解答 ) 6.-7 より, 添字が i > heap-size[]/2 となるものは全て葉であるため何も起きない. CIRQUE05 は MX-HEPIFY(,) を呼び出した! しかし なに m(ry

39 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE MX-HEPIFY のコードは,Line0 の再帰呼び出しを除けばかなり小さい定数係数を持つ. しかし, あるコンパイラは再帰呼び出しを効率の悪いコードに変換するかもしれない. 再帰の代わりに繰り返し構造子 ( ループ ) を用いて効率のよい MX-HEPIFY を書け ( 解答 ) MX-HEPIFY(,i) while ( 条件式 ) 2 do l LEFT(i) 3 r RIGHT(i) 4 if l heap-size[] ND [l]>[i] 5 then largest l 6 if r heap-size[] ND [r] > [largest] 7 then largest r 8 if largest i 9 then exchange [i] [largest] 0 i largest ( 条件式 )=NOT(([i] が右の子, 左の子両方を持ち, その両方より大きい )OR([i] がどちらか片方の子のみを持ち, それより大きい )OR([i] は葉ではない ))

40 6.2 ヒープ条件の維持 (Maintaining the heap property) EXERCISE サイズ n のヒープに対する MX-HEPIFY の最悪実行時間が Ω(lgn) となることを示せ.( ヒント : n 点からなるヒープに対して, 根から葉に下る路上の全ての節点で MX-HEPIFY が再帰的に呼び出されるように節点の値を定めよ.) ( 解答 ) 最悪のケースの場合, 根から葉に至るまで, 全ての節点で MX-HEPIFY が呼び出されるので, 木の高さが h のとき,Θ() が h 回呼び出されるので最悪実行時間は Θ(h) となる から n 個の節点を持つヒープの高さは lgn であるから, したがって Θ(h) = Θ(lgn) である. 漸近的上界, 外界が一致しているため, 最悪実行時間は Ω(lgn) とも言える.

41 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

42 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP n=length[] とすると,Exercise 6.-7 より部分配列 [( n/2 +) n] の要素は全て葉 ( つまり最小の max- ヒープ ) 木のそれぞれの節点において, 後ろから順に MX-HEPIFY を繰り返し実行すれば, max- ヒープを構成できる アルゴリズム BUILD-MX-HEP() heap-size[] length[] 2 for i length[]/2 downto 3 do MX-HEPIFY(,i) Line 2-3 for ループヒープの節点全てに 後ろから順に MX-HEPIFY を実行する

43 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP heap-size[] length[](=0) length[]/2 =5 for ループは i=5 からスタート

44 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= i

45 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=5 MX-HEPIFY(,5) を実行交換はしない [5] を根とする部分 max- ヒープを構成 i

46 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=4 4 3 i

47 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=4 MX-HEPIFY(,4) を実行

48 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=4 MX-HEPIFY(,4) を実行 [4] と [8] を交換 [4] を根とする部分 max- ヒープを構成

49 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=3 4 i

50 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=3 MX-HEPIFY(,3) を実行

51 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=3 MX-HEPIFY(,3) を実行 [3] と [7] を交換 [3] を根とする部分 max ヒープを構成

52 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=2 i

53 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=2 MX-HEPIFY(,2) を実行

54 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=2 MX-HEPIFY(,2) を実行 [2] と [5] を交換

55 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i=2 MX-HEPIFY(,2) を実行 [5] と [0] を交換 [2] を根とする部分 max ヒープを構成

56 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= i

57 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= MX-HEPIFY(,) を実行

58 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= MX-HEPIFY(,) を実行 [] と [2] を交換

59 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= MX-HEPIFY(,) を実行 [2] と [4] を交換

60 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP i= MX-HEPIFY(,) を実行 [4] と [9] を交換 [] を根とする部分 max- ヒープ, 目的の max ヒープが構成された

61 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP [] を根とする部分 max- ヒープ, 目的の max ヒープが構成された

62 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP アルゴリズムの正当性次のループ不変式を利用して BUID-MX-HEP の正当性を示す Line 2-3 の for ループの各繰り返しが開始される時点では, 各節点 i+,i+2,,n はある max- ヒープの根である 初期条件 : ループの最初の繰り返しでは,i= n/2 である 各節点 n/2 +, n/2 +2,.,n は葉であり, したがって自明な max- ヒープの根である ループ内条件 : ループの各繰り返しが不変式を維持することを示すために, 節点 i の子は i より大きい番号を持つことに注意する ループ不変式が成り立つとすると, 節点 i の子はいずれも max- ヒープの根となる これは,MX-HEPIFY(,i) が節点 i を max- ヒープの根に修正する時に必要とする条件そのものである さらに, この MX-HEPIFY の呼び出しは節点 i+,i+2,,n が max- ヒープの根であるという性質を保存する

63 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP アルゴリズムの正当性 i を 減らした時に,for ループのつぎの繰り返しに対するループ不変式が再び成立する これでループの不変式の正当性が示された 終了条件 : 手続きは i=0 で終了する ループ不変式から, 各節点,2,,n が部分 max- ヒープの根である 特に, 節点 は max- ヒープ全体の根であるため, 配列から max- ヒープが正しく構成されたことになる

64 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP 実行時間の吟味 MX-HEPIFY の各呼び出しに O(lgn) 時間かかり, 呼び出しは O(n) 回起こるので,BUILD-MX-HEP の実行時間は高々 O(nlgn) である しかし, ある節点における MX-HEPIFY の実行時間はその節点の高さに依存すること, そしてほとんどの節点の高さは小さいことに注意すると, よりタイトな上界が導出可能 Exercise 6.-2 より n 個の要素を持つヒープの高さは lgn であり, 高さ h の節点は高々 n/2 h+ 個しかない (Exercise 6.3-3) ことを用いて解析する

65 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP 実行時間の吟味 MX-HEPIFY が高さ h の節点で呼ばれたときに要する時間は, 前節より O(h) であるしたがって,BUILD-MX-HEP の全コストは上から lgn h=0 n 2 h+ O h = O n lgn h=0 h 2 n で抑えられるここで等比無限級数の収束の公式 ( ホワイトボードにて説明 ) を用いると, 右辺の和は h 2 h h=0 = /2 2 2 = 2 と計算できるので,BUILD-MX-HEP の実行時間の上界は

66 6.3 ヒープの構成 (Building a heap) 手続き BUILD-MX-HEP 実行時間の吟味 O n lgn h=0 h 2 n = O n h=0 h 2 n = O(n) となる したがって, 未ソートの配列から max- ヒープを線形時間で構成できるということがわかった

67 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

68 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT BUILD-MX-HEP を用いて入力配列 [..n] 中に max- ヒープを構成する 配列の最大要素は構成された max- ヒープの根, つまり [] に格納されているので,[] を [n] と交換することで, 最大要素を配列の正しい位置に配置できる ここで (heap-size[] を 減らすことによって ) 節点 n をヒープから 取り除く と,[] の子はどちらも max- ヒープの根となっているから,MX-HEPIFY(,) を 回呼び出せば残りの配列は容易に max- ヒープとなる これを繰り返すことで配列を正しくソートすることができる アルゴリズム HEPSORT() BUILD-MX-HEP() 2 for i length[] downto 2 3 do exchange [] [i] 4 heap-size[] heap-size[]- 5 MX-HEPIFY(,) Line 入力配列を BUILD-MX-HEP によって max- ヒープにする

69 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT BUILD-MX-HEP を用いて入力配列 [..n] 中に max- ヒープを構成する 配列の最大要素は構成された max- ヒープの根, つまり [] に格納されているので,[] を [n] と交換することで, 最大要素を配列の正しい位置に配置できる ここで (heap-size[] を 減らすことによって ) 節点 n をヒープから 取り除く と,[] の子はどちらも max- ヒープの根となっているから,MX-HEPIFY(,) を 回呼び出せば残りの配列は容易に max- ヒープとなる これを繰り返すことで配列を正しくソートすることができる アルゴリズム HEPSORT() BUILD-MX-HEP() 2 for i length[] downto 2 3 do exchange [] [i] 4 heap-size[] heap-size[]- 5 MX-HEPIFY(,) Line 2-5 for ループ配列の後ろから 2 つ目まで繰り返す max- ヒープの根の要素を i 番目の要素を交換し,heap-size[] を 減らすことでヒープから取り除く その後, ヒープが max- ヒープとなるように MX-HEPIFY を 回呼び出して [] を適正位置に滑り落とす

70 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT BUILD-MX-HEP によって構成された直後の max- ヒープデータ構造

71 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=0 [] と [0] を交換する

72 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=0 [] と [0] を交換する

73 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=0-=9 [0] をヒープから取り除く

74 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=9 MX-HEPIFY(,) を実行

75 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=9 MX-HEPIFY(,) を実行 [] と [2] を交換

76 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=9 MX-HEPIFY(,) を実行 [2] と [4] を交換

77 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=9 MX-HEPIFY(,) を実行 [4] と [9] を交換

78 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=0 heap-size[]=9 再び max- ヒープが構成された

79 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=9 [] と [9] を交換する

80 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=9 [] と [9] を交換する

81 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=9-=8 [9] をヒープから取り除く

82 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=8 MX-HEPIFY(,) を実行

83 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=8 MX-HEPIFY(,) を実行 [] と [3] を交換

84 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=8 MX-HEPIFY(,) を実行 [3] と [6] を交換

85 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=9 heap-size[]=8 再び max- ヒープが構成された

86 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=8 [] と [8] を交換

87 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=8 [] と [8] を交換

88 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=8-=7 [8] をヒープから取り除く

89 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=7 MX=HEPIFY(,) を実行

90 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=7 MX=HEPIFY(,) を実行 [] と [3] を交換

91 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=7 MX=HEPIFY(,) を実行 [3] と [7] を交換

92 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=8 heap-size[]=7 再び max- ヒープが構成された

93 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=7 [] と [7] を交換

94 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=7 [] と [7] を交換

95 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=7-=6 [7] をヒープから取り除く

96 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=6 MX-HEPIFY(,) を実行

97 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=6 MX-HEPIFY(,) を実行 [] と [2] を交換

98 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=6 MX-HEPIFY(,) を実行 [2] と [5] を交換

99 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=7 heap-size[]=6 再び max- ヒープが構成された

100 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=6 [] と [6] を交換

101 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=6 [] と [6] を交換

102 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=6-=5 [6] をヒープから取り除く

103 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=5 MX-HEPIFY(,) を実行する

104 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=5 MX-HEPIFY(,) を実行する [] と [2] を交換

105 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=5 MX-HEPIFY(,) を実行する [2] と [4] を交換

106 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=6 heap-size[]=5 再び max- ヒープが構成された

107 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=5 [5] と [] を交換

108 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=5 [5] と [] を交換

109 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=5-=4 [5] をヒープから取り除く

110 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=4 MX-HEPIFY(,) を実行

111 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=4 MX-HEPIFY(,) を実行 [] と [2] を交換

112 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=5 heap-size[]=4 再び max- ヒープが構成された

113 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=4 [] と [4] を交換

114 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=4 [] と [4] を交換

115 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=4-=3 [4] をヒープから取り除く

116 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=3 MX-HEPIFY(,) を実行する

117 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=3 MX-HEPIFY(,) を実行する [] と [3] を交換する

118 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=4 heap-size[]=3 再び max- ヒープが構成された

119 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=3 [] と [3] を交換

120 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=3 [] と [3] を交換

121 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=3-=2 [3] をヒープから取り除く

122 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=2 MX-HEPIFY(,) を実行する

123 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=2 MX-HEPIFY(,) を実行する [] と [2] を交換

124 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=3 heap-size[]=2 再び max- ヒープが構成された

125 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=2 heap-size[]=2 [] と [2] を交換

126 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=2 heap-size[]=2 [] と [2] を交換

127 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=2 heap-size[]=2-= [2] をヒープから取り除く

128 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=2 heap-size[]= MX=HEPIFY(,) を実行する

129 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i=2 heap-size[]= 再び max- ヒープが構成された

130 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT length[]=0 i= heap-size[]= ループ終了

131 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT 以上で配列が正しくソートされた

132 6.4 ヒープソート (The heapsort algorithm) 手続き HEPSORT 計算時間の吟味 Line n=length[] とすると BUILD-MX-HEP の呼び出しに O(n) かかる HEPSORT() BUILD-MX-HEP() 2 for i length[] downto 2 3 do exchange [] [i] 4 heap-size[] heap-size[]- 5 MX-HEPIFY(,) Line 2-3 for ループ MX-HEPIFY が n- 回呼び出される MX-HEIFY の 回の呼び出しに O(lgn) かかるので, 全体で O(nlgn) かかる したがって, 手続き HEPSORT 全体では O(nlgn) 時間を要する

133 6.4 ヒープソート (The heapsort algorithm) EXERCISE 6.4- 図 6.4 を参考にして, 配列 = 5,3,2,25,7,7,20,8,4 に対する HEPSORT の動作を示せ. ( 解答 ) 希望があればホワイトボードで

134 6.4 ヒープソート (The heapsort algorithm) EXERCISE つぎのループ不変式を用いて,HEPSORT の正当性を論ぜよ : Line 2-5 の for ループの各繰り返しの直前では以下が成立する. 部分配列 [..i] は [..n] の大きい方から i 個の要素を含む max- ヒープである. また, 部分配列 [i+..n] は [..n] の大きい方から n-i 個の要素をソートされた順序で含む. ( 解答 ) 初期条件 : ループの最初の繰り返しの直前では i=n である. 部分配列 [ i] は配列 そのものであり, 直前の BUILD-MX-HEP の手続きによって max- ヒープになっている. ループ内条件 : [] と [i] を交換し,heap-size[] を 減少させたとき,[i], つまり max- ヒープの根であった節点はヒープから取り除かれ,[] がヒープの新しい根となる. このとき,[] 以外の節点は全て max- ヒープの根となっているため, MX-HEPIFY(,) を 回呼び出すだけで max- ヒープを再構成できる. すなわち, 部分配列 [ i] は [ n] の小さいほうから i 個の要素を含む max- ヒープとなっている

135 CONTENTS 6. ヒープ (Heap) 6.2 ヒープ条件の維持 (Maintaining the heap property) 6.3 ヒープの構成 (Building a heap) 6.4 ヒープソート (The heapsort algorithm) 6.5 優先度付きキュー (Priority queues)

136 6.5 優先度付きキュー (Priority queues) 優先度付きキュー (priority queue) 要素の集合 S を保持するためのデータ構造 各要素はキー (key) と呼ばれる値を持つ 優先度付き max-キューと優先度付き min-キューの2 種類がある 優先度付き max- キュー (max-priority-queue) の操作 INSERT(S,x): 集合 S に要素 x を挿入する MXIMUM(S): 最大のキーを持つ S の要素を返す EXTRCT-MX(S): 最大のキーを持つ S の要素を S から削除してその値を返す INCRESE-KEY(S,x,k): 要素 x のキーの値を新しいキー値 kに変更するただし,k は x の現在のキー以上と仮定する

137 6.5 優先度付きキュー (Priority queues) 優先度付き max- キューの応用 共用計算機上でのジョブのスケジュール 優先度付き max- キューは実行待ちジョブとそれらの相対的な優先度を保持していて, ジョブが終了または割り込みがかかった時に, 一時中断しているジョブの中から EXTRCT-MX を用いて新しいジョブを選ぶ 新しいジョブは INSERT を用いていつでもキューに挿入できる 集合 S の優先度付き max- キュー 所持する値が大きいほど優先度が高いジョブ

138 6.5 優先度付きキュー (Priority queues) 優先度付き min- キュー INSERT, MINIMUM, EXTRCT-MIN, DECRESE-KEY 操作が可能 事象駆動シミュレータで利用される キューに格納される要素はシミュレートされる事象であり, 対応する生起時刻がそのキーとなる各ステップでは,EXTRCT-MIN を用いて次にシミュレートする事象を選択する新しい事象が発生したとき INSERT を用いて優先度付き min- キューに挿入される 集合 S の優先度付き min- キュー 所持する値 ( 生起時刻 ) が小さいほど先にシミュレートされる 8 0 4

139 6.5 優先度付きキュー (Priority queues) ハンドル (handle) ジョブのスケジューリングや事象駆動型のシミュレーションのような応用では, その応用に現れるオブジェクトが優先度付きキューに格納される要素である. このとき, 応用のどのオブジェクトが優先度付きキューのどの要素に対応するか, あるいはその逆を決定する必要がしばしば生じる. そこで, ヒープを優先度付きキューの実現に用いるとき, ヒープの各要素の中に対応するオブジェクトへのハンドル (handle) を格納しておく必要がしばしば生じる. ハンドルの正確な構造 ( たとえば, ポインタ, 整数など ) は応用に依存する. ( 例 : 配列の添字 )

140 6.5 優先度付きキュー (Priority queues) 手続き HEP-MXIMUM MXIMUM を O() 時間で実現する アルゴリズム HEP-MXIMUM() return [] max- ヒープの場合, 集合の最大値が根に格納されているため, 単純に [] を出力するだけでよい

141 6.5 優先度付きキュー (Priority queues) 手続き HEP-EXTRCT-MX EXTRCT-MX を実現する 手続き HEPSORT の for ループ本体 ( 第 3-5 行 ) に類似している アルゴリズム HEP-EXTRCT-MX() if heap-size[] < 2 then error heap underflow 3 max [] 4 [] [heap-size[]] 5 heap-size[] heap-size[] 6 MX-HEPIFY(,) 7 return max Line -2 if 文 heap-size[] が 未満であれば, エラーメッセージを出力

142 6.5 優先度付きキュー (Priority queues) 手続き HEP-EXTRCT-MX EXTRCT-MX を実現する 手続き HEPSORT の for ループ本体 ( 第 3-5 行 ) に類似している アルゴリズム HEP-EXTRCT-MX() if heap-size[] < 2 then error heap underflow 3 max [] 4 [] [heap-size[]] 5 heap-size[] heap-size[] 6 MX-HEPIFY(,) 7 return max Line 3-5 最大値 [] を max に代入, さらに [] にヒープの最後尾の要素を代入し,heap-size[] を 減少させて最大値をヒープから取り除く

143 6.5 優先度付きキュー (Priority queues) 手続き HEP-EXTRCT-MX EXTRCT-MX を実現する 手続き HEPSORT の for ループ本体 ( 第 3-5 行 ) に類似している アルゴリズム HEP-EXTRCT-MX() if heap-size[] < 2 then error heap underflow 3 max [] 4 [] [heap-size[]] 5 heap-size[] heap-size[] 6 MX-HEPIFY(,) 7 return max Line 6 残されたヒープが max- ヒープ条件を満たすようにする

144 6.5 優先度付きキュー (Priority queues) 手続き HEP-EXTRCT-MX EXTRCT-MX を実現する 手続き HEPSORT の for ループ本体 ( 第 3-5 行 ) に類似している アルゴリズム HEP-EXTRCT-MX() if heap-size[] < 2 then error heap underflow 3 max [] 4 [] [heap-size[]] 5 heap-size[] heap-size[] 6 MX-HEPIFY(,) 7 return max Line 7 ヒープの最大値 max を返す

145 6.5 優先度付きキュー (Priority queues) 手続き HEP-EXTRCT-MX EXTRCT-MX を実現する 手続き HEPSORT の for ループ本体 ( 第 3-5 行 ) に類似している アルゴリズム HEP-EXTRCT-MX() if heap-size[] < 2 then error heap underflow 3 max [] 4 [] [heap-size[]] 5 heap-size[] heap-size[] 6 MX-HEPIFY(,) 7 return max MX-HEPIFY の呼び出し (O(lgn)) 以外では定数時間しかかからないので, HEP-EXTRCT-MX の実行時間は O(lgn) である

146 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY INCRESE-KEY を実現する キー値を増やす優先度付きキューの要素配列の添字 i で表す アルゴリズム HEP-INCRESE-KEY(,i,key) if key < [i] 2 then error new key is smaller than current key 3 [i] key 4 while i > ND [PRENT(i)] < [i] 5 do exchange [i] [PRENT(i)] 6 i PRENT(i) Line -2 if 文入力されたキー値が, 増やす対象となるキー値より小さければエラーメッセージを出力

147 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY INCRESE-KEY を実現する キー値を増やす優先度付きキューの要素配列の添字 i で表す アルゴリズム HEP-INCRESE-KEY(,i,key) if key < [i] 2 then error new key is smaller than current key 3 [i] key 4 while i > ND [PRENT(i)] < [i] 5 do exchange [i] [PRENT(i)] 6 i PRENT(i) Line 3 入力で指定された添字のキー値を, 入力で与えられたキー値に変更

148 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY INCRESE-KEY を実現する キー値を増やす優先度付きキューの要素配列の添字 i で表す アルゴリズム HEP-INCRESE-KEY(,i,key) if key < [i] 2 then error new key is smaller than current key 3 [i] key 4 while i > ND [PRENT(i)] < [i] 5 do exchange [i] [PRENT(i)] 6 i PRENT(i) Line 4-6 while ループキー値が増加したので,max- ヒープ条件が成立しなくなった可能性がある [i] が max- ヒープ条件を満たすような位置に来るように, その親と交換していく

149 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY INCRESE-KEY を実現する キー値を増やす優先度付きキューの要素配列の添字 i で表す アルゴリズム HEP-INCRESE-KEY(,i,key) if key < [i] 2 then error new key is smaller than current key 3 [i] key 4 while i > ND [PRENT(i)] < [i] 5 do exchange [i] [PRENT(i)] 6 i PRENT(i) Line 3 で値が更新される節点から根に至る経路の長さが O(lgn) だから, n 個の要素を持つヒープにおける HEP-INCRESE-KEY の実行時間は O(lgn)

150 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 )

151 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) [9] に 5 を代入

152 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) [9] に 5 を代入

153 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) i=9 [PRENT(9)]=[4]=8<[9] [9] と [4] を交換

154 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) i=9 [PRENT(9)]=[4]=8<[9] [9] と [4] を交換

155 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) i=4 [PRENT(4)]=[2]=4<[4] [4] と [2] を交換

156 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) i=4 [PRENT(4)]=[2]=4<[4] [4] と [2] を交換

157 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) i=2 [PRENT(2)]=[]=6>[4] 処理が終了

158 6.5 優先度付きキュー (Priority queues) 手続き HEP-INCRESE-KEY 実行例 (HEP-INCRESE-KEY(,9,5) の動作 ) max- ヒープが再構成された

159 6.5 優先度付きキュー (Priority queues) 手続き MX-HEP-INSERT INSERT を実現する 入力は max- ヒープ に挿入される新しい要素のキー 木にキー値 - を持つ新しい葉を加えることで max- ヒープを拡大する HEP-INCRESE-KEY を呼び出し, 新しい節点のキー値を正しい値に設定し,max- ヒープ条件を維持する アルゴリズム Line heap-size[] を 増加させる MX-HEP-INSERT(,key) heap-size[] heap-size[] + 2 [heap-size[]] - 3 HEP-INCRESE-KEY(,heap-size[],key)

160 6.5 優先度付きキュー (Priority queues) 手続き MX-HEP-INSERT INSERT を実現する 入力は max- ヒープ に挿入される新しい要素のキー 木にキー値 - を持つ新しい葉を加えることで max- ヒープを拡大する HEP-INCRESE-KEY を呼び出し, 新しい節点のキー値を正しい値に設定し,max- ヒープ条件を維持する アルゴリズム MX-HEP-INSERT(,key) heap-size[] heap-size[] + 2 [heap-size[]] - 3 HEP-INCRESE-KEY(,heap-size[],key) Line 2 増やした葉にキー値 - を代入

161 6.5 優先度付きキュー (Priority queues) 手続き MX-HEP-INSERT INSERT を実現する 入力は max- ヒープ に挿入される新しい要素のキー 木にキー値 - を持つ新しい葉を加えることで max- ヒープを拡大する HEP-INCRESE-KEY を呼び出し, 新しい節点のキー値を正しい値に設定し,max- ヒープ条件を維持する アルゴリズム MX-HEP-INSERT(,key) heap-size[] heap-size[] + 2 [heap-size[]] - 3 HEP-INCRESE-KEY(,heap-size[],key) Line 3 HEP-INCRESE-KEY を実行して, キー値 - を key に置き換え, さらに max- ヒープ条件を満たすようにする n 個の要素を持つヒープに対する MX-HEP-INSERT の実行時間は O(lgn) したがって, ヒープを用いるとサイズ n の集合上の優先度付きキューの全ての操作を O(nlgn) 時間で実現できる

PowerPoint Presentation

PowerPoint Presentation 算法数理工学 第 2 回 定兼邦彦 クイックソート n 個の数に対して最悪実行時間 (n 2 ) のソーティングアルゴリズム 平均実行時間は (n log n) 記法に隠された定数も小さい in-place ( 一時的な配列が必要ない ) 2 クイックソートの記述 分割統治法に基づく 部分配列 A[p..r] のソーティング. 部分問題への分割 : 配列 A[p..r] を 2 つの部分配列 A[p..q]

More information

PowerPoint Presentation

PowerPoint Presentation 算法数理工学 第 回 定兼邦彦 クイックソートの 確率的アルゴリズム クイックソートの平均的な場合の実行時間を解析する場合, 入力の頻度を仮定する必要がある. 通常は, すべての順列が等確率で現れると仮定 しかし実際にはこの仮定は必ずしも期待できない この仮定が成り立たなくてもうまく動作するクイックソートの確率的アルゴリズムを示す 確率的 radomized) アルゴリズム 動作が入力だけでなく乱数発生器

More information

プログラム言語及び演習Ⅲ

プログラム言語及び演習Ⅲ 平成 28 年度後期データ構造とアルゴリズム期末テスト 各問題中のアルゴリズムを表すプログラムは, 変数の宣言が省略されているなど, 完全なものではありませんが, 適宜, 常識的な解釈をしてください. 疑問があれば, 挙手をして質問してください. 時間計算量をオーダ記法で表せという問題では, 入力サイズ n を無限大に近づけた場合の漸近的な時間計算量を表せということだと考えてください. 問題 1 入力サイズが

More information

memo

memo 数理情報工学演習第一 C ( 第 8 回 ) 206/06/3 DEPARTMENT OF MATHEMATICAL INFORMATICS 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 プライオリティキュー ヒープ 課題 : ヒープソート 2 プロトタイプ宣言 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

Microsoft PowerPoint - 05.pptx

Microsoft PowerPoint - 05.pptx アルゴリズムとデータ構造第 5 回 : データ構造 (1) 探索問題に対応するデータ構造 担当 : 上原隆平 (uehara) 2015/04/17 アルゴリズムとデータ構造 アルゴリズム : 問題を解く手順を記述 データ構造 : データや計算の途中結果を蓄える形式 計算の効率に大きく影響を与える 例 : 配列 連結リスト スタック キュー 優先順位付きキュー 木構造 今回と次回で探索問題を例に説明

More information

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2017.pptx // データ構造とアルゴリズム IⅠ 第 回単一始点最短路 (II)/ 全点対最短路 トポロジカル ソート順による緩和 トポロジカル ソート順に緩和 閉路のない有向グラフ限定 閉路がないならトポロジカル ソート順に緩和するのがベルマン フォードより速い Θ(V + E) 方針 グラフをトポロジカル ソートして頂点に線形順序を与える ソート順に頂点を選び, その頂点の出辺を緩和する 各頂点は一回だけ選択される

More information

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - 06.pptx アルゴリズムとデータ構造第 6 回 : 探索問題に対応するデータ構造 (2) 担当 : 上原隆平 (uehara) 2015/04/22 内容 スタック (stack): 最後に追加されたデータが最初に取り出される 待ち行列 / キュー (queue): 最初に追加されたデータが最初に取り出される ヒープ (heap): 蓄えられたデータのうち小さいものから順に取り出される 配列による実装 連結リストによる実装

More information

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1 4. ソート ( 教科書 p.205-p.273) 整列すなわちソートは アプリケーションを作成する際には良く使われる基本的な操作であり 今までに数多くのソートのアルゴリズムが考えられてきた 今回はこれらソートのアルゴリズムについて学習していく ソートとはソートとは与えられたデータの集合をキーとなる項目の値の大小関係に基づき 一定の順序で並べ替える操作である ソートには図 1 に示すように キーの値の小さいデータを先頭に並べる

More information

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - algo ppt [互換モード] ( 復習 ) アルゴリズムとは アルゴリズム概論 - 探索 () - アルゴリズム 問題を解くための曖昧さのない手順 与えられた問題を解くための機械的操作からなる有限の手続き 機械的操作 : 単純な演算, 代入, 比較など 安本慶一 yasumoto[at]is.naist.jp プログラムとの違い プログラムはアルゴリズムをプログラミング言語で表現したもの アルゴリズムは自然言語でも, プログラミング言語でも表現できる

More information

Microsoft PowerPoint - 13approx.pptx

Microsoft PowerPoint - 13approx.pptx I482F 実践的アルゴリズム特論 13,14 回目 : 近似アルゴリズム 上原隆平 (uehara@jaist.ac.jp) ソートの下界の話 比較に基づく任意のソートアルゴリズムはΩ(n log n) 時間の計算時間が必要である 証明 ( 概略 ) k 回の比較で区別できる場合の数は高々 2 k 種類しかない n 個の要素の異なる並べ方は n! 通りある したがって少なくとも k n 2 n!

More information

Microsoft PowerPoint - DA1_2018.pptx

Microsoft PowerPoint - DA1_2018.pptx データ構造とアルゴリズム IB 九州大学大学院システム情報科学研究院情報学部門横尾真 E-mail: yokoo@inf.kyushu-u.ac.jp http://agent.inf.kyushu-u.ac.jp/~yokoo/ 自己紹介 年東京大学大学院工学系研究科電気工学専門課程修士課程修了 同年日本電信電話株式会社 (NTT) 入社 NTT 情報通信処理研究所 ( 神奈川県横須賀市 ), NTT

More information

memo

memo 計数工学プログラミング演習 ( 第 6 回 ) 2016/05/24 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : 再帰呼び出し 2 分探索木 深さ優先探索 課題 : 2 分探索木を用いたソート 2 再帰呼び出し 関数が, 自分自身を呼び出すこと (recursive call, recursion) 再帰を使ってアルゴリズムを設計すると, 簡単になることが多い

More information

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - ca ppt [互換モード] 大阪電気通信大学情報通信工学部光システム工学科 2 年次配当科目 コンピュータアルゴリズム 良いアルゴリズムとは 第 2 講 : 平成 20 年 10 月 10 日 ( 金 ) 4 限 E252 教室 中村嘉隆 ( なかむらよしたか ) 奈良先端科学技術大学院大学助教 y-nakamr@is.naist.jp http://narayama.naist.jp/~y-nakamr/ 第 1 講の復習

More information

Microsoft PowerPoint - DA1_2019.pptx

Microsoft PowerPoint - DA1_2019.pptx データ構造とアルゴリズム IB 九州大学大学院システム情報科学研究院情報学部門横尾真 E-mail: yokoo@inf.kyushu-u.ac.jp http://agent.inf.kyushu-u.ac.jp/~yokoo/ 自己紹介 年東京大学大学院工学系研究科電気工学専門課程修士課程修了 同年日本電信電話株式会社 (NTT) 入社 NTT 情報通信処理研究所 ( 神奈川県横須賀市 ), NTT

More information

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2017.pptx 1// 小テスト内容 データ構造とアルゴリズム IⅠ 第 回単一始点最短路 (I) 1 1 第 章の構成. 単一始点最短路問題 単一始点最短路問題とは 単一始点最短路問題の考え方 単一始点最短路問題を解くつのアルゴリズム ベルマン フォードのアルゴリズム トポロジカル ソートによる解法 ダイクストラのアルゴリズム 1 1 単一始点最短路問題とは 単一始点最短路問題とは 前提 : 重み付き有向グラフ

More information

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - algo ppt [互換モード] 平衡木 アルゴリズム概論 - 探索 (2)- 安本慶一 yasumoto[at]is.naist.jp 二分探索木 高さがデータを挿入 削除する順番による 挿入 削除は平均 O(log n) だが, 最悪 O(n) 木の高さをできるだけ低く保ちたい 平衡木 (balanced tree) データを更新する際に形を変形して高さが log 2 n 程度に収まるようにした木 木の変形に要する時間を log

More information

Microsoft PowerPoint - DA2_2018.pptx

Microsoft PowerPoint - DA2_2018.pptx 1//1 データ構造とアルゴリズム IⅠ 第 回単一始点最短路 (I). 単一始点最短路問題 第 章の構成 単一始点最短路問題とは 単一始点最短路問題の考え方 単一始点最短路問題を解くつのアルゴリズム ベルマン フォードのアルゴリズム トポロジカル ソートによる解法 ダイクストラのアルゴリズム 単一始点最短路問題とは 単一始点最短路問題とは 前提 : 重み付き有向グラフ 特定の開始頂点 から任意の頂点

More information

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

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル 概略設計書 作成者築山修治作成日 2012 年 10 月 1 日 概要 ( どのような入力に対して, どのような出力をするかの概要説明 ) * 木 T および質問点対の集合 P が与えられたとき, 各質問点対 p = (v,w) P の最下位共通先祖 ( すなわち木 T において点 v と w の共通の先祖 a で,a の真の子孫には v と w の共通の先祖が無いような点 ) を見出す関数である.

More information

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

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

More information

COMPUTING THE LARGEST EMPTY RECTANGLE

COMPUTING THE LARGEST EMPTY RECTANGLE COMPUTING THE LARGEST EMPTY RECTANGLE B.Chazelle, R.L.Drysdale and D.T.Lee SIAM J. COMPUT Vol.15 No.1, February 1986 2012.7.12 TCS 講究関根渓 ( 情報知識ネットワーク研究室 M1) Empty rectangle 内部に N 個の点を含む領域長方形 (bounding

More information

memo

memo 計数工学プログラミング演習 ( 第 4 回 ) 2016/05/10 DEPARTMENT OF MATHEMATICA INFORMATICS 1 内容 リスト 疎行列 2 連結リスト (inked ists) オブジェクトをある線形順序に並べて格納するデータ構造 単方向連結リスト (signly linked list) の要素 x キーフィールド key ポインタフィールド next x->next:

More information

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - kougi10.ppt C プログラミング演習 第 10 回二分探索木 1 例題 1. リストの併合 2 つのリストを併合するプログラムを動かしてみる head1 tail1 head2 tail2 NULL NULL head1 tail1 tail1 があると, リストの併合に便利 NULL 2 #include "stdafx.h" #include struct data_list { int data;

More information

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

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し 1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値 O. value を持つとする このようなオブジェクトを保存する二分木ヒープについて考える 二分木ヒープは以下の二つの制約のある二分木である

More information

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

アルゴリズムとデータ構造 講義 アルゴリズムとデータ構造 第 2 回アルゴリズムと計算量 大学院情報科学研究科情報理工学専攻情報知識ネットワーク研究室喜田拓也 講義資料 2018/5/23 今日の内容 アルゴリズムの計算量とは? 漸近的計算量オーダーの計算の方法最悪計算量と平均計算量 ポイント オーダー記法 ビッグオー (O), ビッグオメガ (Ω), ビッグシータ (Θ) 2 お風呂スケジューリング問題 お風呂に入る順番を決めよう!

More information

Taro-2分探索木Ⅰ(公開版).jtd

Taro-2分探索木Ⅰ(公開版).jtd 2 分探索木 Ⅰ 0. 目次 1. 2 分探索木とは 2. 2 分探索木の作成 3. 2 分探索木の走査 3. 1 前走査 3. 2 中走査 3. 3 問題 問題 1 問題 2 後走査 4. 2 分探索木の表示 - 1 - 1. 2 分探索木とは 木はいくつかの節点と節点同士を結ぶ辺から構成される 2 つの節点 u,v が直接辺で結ばれているとき 一方を親節点 他方を子節点という ある節点の親節点は高々

More information

Microsoft PowerPoint - ppt-7.pptx

Microsoft PowerPoint - ppt-7.pptx テーマ 7: 最小包含円 点集合を包含する半径最小の円 最小包含円問題 問題 : 平面上に n 点の集合が与えられたとき, これらの点をすべて内部に含む半径最小の円を効率よく求める方法を示せ. どの点にも接触しない包含円 すべての点を内部に含む包含円を求める 十分に大きな包含円から始め, 点にぶつかるまで徐々に半径を小さくする 1 点にしか接触しない包含円 現在の中心から周上の点に向けて中心を移動する

More information

情報処理Ⅰ

情報処理Ⅰ Java フローチャート -1- フローチャート ( 流れ図 ) プログラムの処理手順 ( アルゴリズム ) を図示したもの 記号の種類は下記のとおり 端子記号 ( 開始 終了 ) 処理記号計算, 代入等 条件の判定 条件 No ループ処理 LOOP start Yes データの入力 出力 print など 定義済み処理処理名 end サンプルグログラム ( 大文字 小文字変換 ) 大文字を入力して下さい

More information

PowerPoint Presentation

PowerPoint Presentation 今週のトピックス アルゴリズムとデータ構造 第 10 回講義 : 探索その 1 探索 (search) 逐次探索 (sequential search) 2 分探索 (binary search) 内挿探索 (interpolation search) Produced by Qiangfu Zhao (Since 2009), All rights reserved (c) 1 Produced

More information

離散数学

離散数学 離散数学 最短経路問題 落合秀也 その前に 前回の話 深さ優先探索アルゴリズム 開始点 から深さ優先探索を行うアルゴリズム S.pu() Wl S not mpty v := S.pop() I F[v] = l Tn, F[v] := tru For no u n A[v] S.pu(u) EnFor EnI EnWl (*) 厳密には初期化処理が必要だが省略している k 時間計算量 :O(n+m)

More information

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 文 ) */ int i, no; for (i = 0; i

More information

PowerPoint Presentation

PowerPoint Presentation 最適化手法 第 回 工学部計数工学科 定兼邦彦 http://researchmap.jp/sada/resources/ 前回の補足 グラフのある点の隣接点をリストで表現すると説明したが, 単に隣接点の集合を持っていると思ってよい. 互いに素な集合のデータ構造でも, 単なる集合と思ってよい. 8 3 4 3 3 4 3 4 E v 重み 3 8 3 4 4 3 {{,},{3,8}} {{3,},{4,}}

More information

Microsoft Word - 13

Microsoft Word - 13 担当 : 富井尚志 (tommy@ynu.ac.jp) アルゴリズムとデータ構造 講義日程 1. 基本的データ型 2. 基本的制御構造 3. 変数のスコープルール. 関数 4. 配列を扱うアルゴリズムの基礎 (1). 最大値, 最小値 5. 配列を扱うアルゴリズムの基礎 (2). 重複除去, 集合演算, ポインタ 6. ファイルの扱い 7. 整列 (1). 単純挿入整列 単純選択整列 単純交換整列

More information

Taro-再帰関数Ⅲ(公開版).jtd

Taro-再帰関数Ⅲ(公開版).jtd 0. 目次 1 1. ソート 1 1. 1 挿入ソート 1 1. 2 クイックソート 1 1. 3 マージソート - 1 - 1 1. ソート 1 1. 1 挿入ソート 挿入ソートを再帰関数 isort を用いて書く 整列しているデータ (a[1] から a[n-1] まで ) に a[n] を挿入する操作を繰り返す 再帰的定義 isort(a[1],,a[n]) = insert(isort(a[1],,a[n-1]),a[n])

More information

alg2015-4r2.ppt

alg2015-4r2.ppt 1 アルゴリズムとデータ 構造 第 4 回基本的なデータ構造 ( ヒープ ) 再帰的アルゴリズム 2017/04/18 アルゴリズムとデータ構造 2 リスト リストとは要素を 0 個以上 1 列に並べたもの リスト a 0,a 1,,a n-1 の実現法 1. 配列 (array) 前回の復習 (1/3) a 0 a 1 a n-1 2. 連結リスト (linked list) init a 0 a

More information

Microsoft Word - no206.docx

Microsoft Word - no206.docx 3.2 双方向リスト 今までのリストは 前から順にたどることしかできませんでした 今度は逆にもたどることができる 双方向リストを扱います この場合は 構造体には次を表すポインタの他に前を表すポインタを持つ ことになります 今回は最初と最後をポインタを使うと取り扱いが面倒になるので 最初 (start) と最後 (end) を どちらとも構造体 ( 値は意味を持たない ) を使うことにします こうすることによって

More information

データ構造

データ構造 アルゴリズム及び実習 3 馬青 1 バブルソート 考え方 : 隣接する二つのデータを比較し データの大小関係が逆のとき 二つのデータの入れ替えを行って整列を行う方法である 2 バブルソートの手順 配列 a[0],a[1],,a[n-1] をソートする場合 ステップ 1: 配列 a[0] と a[1],a[1] と a[2],,a[n-2] と a[n-1] と となり同士を比較 ( 大小が逆であれば

More information

Microsoft PowerPoint - 10.pptx

Microsoft PowerPoint - 10.pptx m u. 固有値とその応用 8/7/( 水 ). 固有値とその応用 固有値と固有ベクトル 行列による写像から固有ベクトルへ m m 行列 によって線形写像 f : R R が表せることを見てきた ここでは 次元平面の行列による写像を調べる とし 写像 f : を考える R R まず 単位ベクトルの像 u y y f : R R u u, u この事から 線形写像の性質を用いると 次の格子上の点全ての写像先が求まる

More information

Microsoft PowerPoint - 7.pptx

Microsoft PowerPoint - 7.pptx 7. 木構造 7-1. データ構造としての木 グラフ理論での木の定義 根付き木 7-2.2 分探索木 7-3. 高度な木 ( 平衡木 ) AVL 木 B 木 1 7-1 1. データ構造としての木 2 木構造 木構造を表すデータ構造の一つとしてヒープがある しかし ヒープでは 配列を用いプではるため 要素数で木の形状が一通りに決定してしまった ここでは 再帰的なデータ構造を用いることにより より柔軟な木構造が構築可能なより柔軟な木構造が構築可能なことを見ていく

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

Microsoft PowerPoint - DA2_2019.pptx

Microsoft PowerPoint - DA2_2019.pptx Johnon のアルゴリズム データ構造とアルゴリズム IⅠ 第 回最大フロー 疎なグラフ, 例えば E O( V lg V ) が仮定できる場合に向いている 隣接リスト表現を仮定する. 実行時間は O( V lg V + V E ). 上記の仮定の下で,Floyd-Warhall アルゴリズムよりも漸近的に高速 Johnon のアルゴリズム : アイデア (I) 辺重みが全部非負なら,Dikra

More information

Taro-リストⅠ(公開版).jtd

Taro-リストⅠ(公開版).jtd 0. 目次 1. 再帰的なデータ構造によるリストの表現 1. 1 リストの作成と表示 1. 1. 1 リストの先頭に追加する方法 1. 1. 2 リストの末尾に追加する方法 1. 1. 3 昇順を保存してリストに追加する方法 1. 2 問題 問題 1 問題 2-1 - 1. 再帰的なデータ構造によるリストの表現 リストは データの一部に次のデータの記憶場所を示す情報 ( ポインタという ) を持つ構造をいう

More information

第2回

第2回 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 第 回基本データ構造 連結リストとその操作 -. リスト構造 データ部 と ポインタ部 で構成され ポインタをたどることによりデータを扱うことができる構造 -. 単方向リストとその操作 --. 単方向リスト 次のデータへのポインタを つだけ持っているデータ構造 ( データ部は 複数のデータを持っている場合もある ) データ部

More information

2011年度 大阪大・理系数学

2011年度 大阪大・理系数学 0 大阪大学 ( 理系 ) 前期日程問題 解答解説のページへ a a を自然数とする O を原点とする座標平面上で行列 A= a の表す 次変換 を f とする cosθ siθ () >0 および0θ

More information

前期募集 令和 2 年度山梨大学大学院医工農学総合教育部修士課程工学専攻 入学試験問題 No.1/2 コース等 メカトロニクス工学コース 試験科目 数学 問 1 図 1 は, 原点 O の直交座標系 x,y,z に関して, 線分 OA,OB,OC を 3 辺にもつ平行六面体を示す. ここで, 点 A

前期募集 令和 2 年度山梨大学大学院医工農学総合教育部修士課程工学専攻 入学試験問題 No.1/2 コース等 メカトロニクス工学コース 試験科目 数学 問 1 図 1 は, 原点 O の直交座標系 x,y,z に関して, 線分 OA,OB,OC を 3 辺にもつ平行六面体を示す. ここで, 点 A No.1/2 数学 問 1 図 1 は, 原点 O の直交座標系 x,y,z に関して, 線分 OA,OB,OC を 3 辺にもつ平行六面体を示す. ここで, 点 A,B,C の座標はそれぞれ A (,6,-2), B (4,-5,3),C (-5.1,4.9,.9) である. 次の問いに答えよ. (1) を求めよ. (2) および の向きを解答用紙の図 1 に描け. (3) 図 1 の平行六面体の体積

More information

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦   形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110, オートマトン 形式言語及び演習 1 有限オートマトンとは 酒井正彦 wwwtrscssinagoya-uacjp/~sakai/lecture/automata/ 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110, } 形式言語 : 数学モデルに基づいて定義された言語 認識機械 : 文字列が該当言語に属するか? 文字列 機械 受理

More information

Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - ad11-09.pptx 無向グラフと有向グラフ 無向グラフ G=(V, E) 頂点集合 V 頂点の対を表す枝の集合 E e=(u,v) 頂点 u, v は枝 e の端点 f c 0 a 1 e b d 有向グラフ G=(V, E) 頂点集合 V 頂点の順序対を表す枝の集合 E e=(u,v) 頂点 uは枝 eの始点頂点 vは枝 eの終点 f c 0 a 1 e b d グラフのデータ構造 グラフ G=(V, E) を表現するデータ構造

More information

memo

memo 計数工学プログラミング演習 ( 第 6 回 ) 2017/05/16 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : 再帰呼び出し 2 分探索木 深さ優先探索 課題 : 2 分探索木を用いたソート 2 再帰呼び出し 関数が, 自分自身を呼び出すこと (recursive call, recursion) 再帰を使ってアルゴリズムを設計すると, 簡単になることが多い

More information

kiso2-09.key

kiso2-09.key 座席指定はありません 計算機基礎実習II 2018 のウェブページか 第9回 ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第7回の復習課題(rev07) 第9回の基本課題(base09) 第8回試験の結果 中間試験に関するコメント コンパイルできない不完全なプログラムなど プログラミングに慣れていない あるいは複雑な問題は 要件 をバラして段階的にプログラムを作成する exam08-2.c

More information

論理と計算(2)

論理と計算(2) 情報科学概論 Ⅰ アルゴリズムと計算量 亀山幸義 http://logic.cs.tsukuba.ac.jp/~kam 亀山担当分の話題 アルゴリズムと計算量 Fibonacci 数列の計算を例にとり アルゴリズムと計算量とは何か 具体的に学ぶ 良いアルゴリズムの設計例として 整列 ( ソーティング ) のアルゴリズムを学ぶ 2 Fibonacci 数 () Fibonacci 数 (2) = if

More information

自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る

自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る 全学共通科目 工学部専門科目 計算機科学概論 アルゴリズムとプログラミングその 1 五十嵐淳 igarashi@kuis.kyoto-u.ac.jp 大学院情報学研究科通信情報システム専攻 自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る

More information

Microsoft PowerPoint - 08LR-conflicts.ppt [互換モード]

Microsoft PowerPoint - 08LR-conflicts.ppt [互換モード] 属性文法 コンパイラ理論 8 LR 構文解析補足 : 属性文法と conflicts 櫻井彰人 Racc (Yacc 系のcc) は属性文法的 非終端記号は 値 (semantic value) を持つ パーザーは パーザースタックをreduceするとき ( 使う規則を X ::= s とする ) s に付随する semantic value (Racc では配列 valueにある ) を用いて action

More information

簡単な検索と整列(ソート)

簡単な検索と整列(ソート) フローチャート (2) アルゴリズム論第 2 回講義 2011 年 10 月 7 日 ( 金 ) 反復構造 ( 一定回数のループ処理 ) START 100 回同じ処理を繰り返す お風呂で子供が指をおって数を数える感じ 繰り返し数を記憶する変数をカウンター ( 変数名 I をよく使う ) と呼ぶ カウンターを初期化して, 100 回繰り返したかどうか判定してそうならば終了そうでなければ処理を実行して

More information

Microsoft Word - VBA基礎(3).docx

Microsoft Word - VBA基礎(3).docx 上に中和滴定のフローチャートを示しました この中で溶液の色を判断する部分があります このような判断はプログラムではどのように行うのでしょうか 判断に使う命令は IF 文を使います IF は英語で もし何々なら という意味になります 条件判断条件判断には次の命令を使います If 条件式 1 Then ElseIf 条件式 2 Then ElseIf 条件式 3 Then 実行文群 1 実行文群 2 実行文群

More information

alg2015-6r3.ppt

alg2015-6r3.ppt 1 アルゴリズムとデータ 構造 第 6 回探索のためのデータ構造 (1) 補稿 : 木の巡回 ( なぞり ) 2 木の巡回 ( 第 5 回探索 (1) のスライド ) 木の巡回 * (traverse) とは 木のすべての節点を組織だった方法で訪問すること 深さ優先探索 (depth-first search) による木の巡回 *) 木の なぞり ともいう 2 3 1 3 4 1 4 5 7 10

More information

Taro-再帰関数Ⅱ(公開版).jtd

Taro-再帰関数Ⅱ(公開版).jtd 0. 目次 6. 2 項係数 7. 二分探索 8. 最大値探索 9. 集合 {1,2,,n} 上の部分集合生成 - 1 - 6. 2 項係数 再帰的定義 2 項係数 c(n,r) は つぎのように 定義される c(n,r) = c(n-1,r) + c(n-1,r-1) (n 2,1 r n-1) = 1 (n 0, r=0 ) = 1 (n 1, r=n ) c(n,r) 0 1 2 3 4 5

More information

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること C プログラミング演習 1( 再 ) 4 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 前回の出席確認演習 #include int main() { FILE *fp; int c, linecount, length, maxlength; fp=fopen("/usr/share/dict/words","r"); if (fp == NULL) return 1; linecount=0; length=0;

More information

2015年度 信州大・医系数学

2015年度 信州大・医系数学 05 信州大学 ( 医系 ) 前期日程問題 解答解説のページへ 放物線 y = a + b + c ( a > 0) を C とし, 直線 y = -を l とする () 放物線 C が点 (, ) で直線 l と接し, かつ 軸と共有点をもつための a, b, c が満 たす必要十分条件を求めよ () a = 8 のとき, () の条件のもとで, 放物線 C と直線 l および 軸とで囲まれた部

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 2 回文字列とポインタ 先週のパズルの解説 答え : 全部 p a 1 図の書き方 : p+1 は式であって その値を格納する記憶場所を考えないので 四角で囲まない 2 p+1 同じものを表すいろいろな書き方をしてみましたが パズル以上の意味はありません プログラム中に書くときは p+1 が短くていいんじゃないかな p+1 は 2 の記憶場所 p[1] は 2 に格納されている値

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

Microsoft PowerPoint - 06graph3.ppt [互換モード]

Microsoft PowerPoint - 06graph3.ppt [互換モード] I118 グラフとオートマトン理論 Graphs and Automata 担当 : 上原隆平 (Ryuhei UEHARA) uehara@jaist.ac.jp http://www.jaist.ac.jp/~uehara/ 1/20 6.14 グラフにおける探索木 (Search Tree in a Graph) グラフG=(V,E) における探索アルゴリズム : 1. Q:={v { 0 }

More information

PowerPoint Template

PowerPoint Template プログラミング演習 Ⅲ Linked List P. Ravindra S. De Silva e-mail: ravi@cs.tut.ac.jp, Room F-413 URL: www.icd.cs.tut.ac.jp/~ravi/prog3/index_j.html 連結リストとは? 一つひとつの要素がその前後の要素との参照関係をもつデータ構造 A B C D 連結リストを使用する利点 - 通常の配列はサイズが固定されている

More information

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

More information

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

Javaによるアルゴリズムとデータ構造 1 algorithm List 1-1 a, b, c List 1-1 // import java.util.scanner; class Max3 { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); int a, b, c; int max; // Chap01/Max3.java

More information

Taro-2分探索木Ⅱ(公開版).jtd

Taro-2分探索木Ⅱ(公開版).jtd 2 分探索木 Ⅱ 0. 目次 5. 2 分探索木の操作 5. 1 要素の探索 5. 2 直前の要素の探索 5. 3 直後の要素の探索 5. 4 要素の削除 5. 5 問題 問題 1-1 - 5. 2 分探索木の操作 5. 1 要素の探索 要素 44 の探索 (1) 要素 と 44 を比較して 左部分木をたどる (2) 要素 33 と 44 を比較して 右部分木をたどる (3) 要素 44 を見つけた

More information

文法と言語 ー文脈自由文法とLR構文解析2ー

文法と言語 ー文脈自由文法とLR構文解析2ー 文法と言語ー文脈自由文法とLR 構文解析 2 ー 和田俊和資料保存場所 http://vrl.sys.wakayama-u.ac.jp/~twada/syspro/ 前回までの復習 最右導出と上昇型構文解析 最右導出を前提とした場合, 上昇型の構文解析がしばしば用いられる. 上昇型構文解析では生成規則の右辺にマッチする部分を見つけ, それを左辺の非終端記号に置き換える 還元 (reduction)

More information

Microsoft Word - no202.docx

Microsoft Word - no202.docx 1.4 ポインタと配列 ポインタ変数は前回説明したように 値の入っているアドレスを示す変数です では 配列はどの ようにメモリ上に格納されるか調べてみましょう ex07.c /* ポインタと配列の関係 */ int a[3]={1, 2, 3; /* int 型の大きさ 3 の配列として宣言 */ int *i; /* int 型へのポインタとして宣言 */ double x[3] = {1.0,

More information

行列、ベクトル

行列、ベクトル 行列 (Mtri) と行列式 (Determinnt). 行列 (Mtri) の演算. 和 差 積.. 行列とは.. 行列の和差 ( 加減算 ).. 行列の積 ( 乗算 ). 転置行列 対称行列 正方行列. 単位行列. 行列式 (Determinnt) と逆行列. 行列式. 逆行列. 多元一次連立方程式のコンピュータによる解法. コンピュータによる逆行列の計算.. 定数項の異なる複数の方程式.. 逆行列の計算

More information

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用 RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項

More information

PG13-6S

PG13-6S プログラム演習 I レポート 学籍番号 担当教員 : 小林郁夫 氏名 実習日平成 26 年 7 月 4 日 提出期限 7 月 11 日提出日 7 月 17 日 1 週遅れ 第 13 回 テーマ : 並べ替えのアルゴリズム 教員使用欄 15 S A B C 再提出 課題 1 バブルソートの実行画面 プログラムのソースコード // day13_akb1.cpp : コンソールアプリケーションのエントリポイントを定義します

More information

alg2015-2r4.ppt

alg2015-2r4.ppt 1 アルゴリズムとデータ 構造 第 2 回アルゴリズムと計算量 授業スライド URL: http://www-ikn.ist.hokudai.ac.jp/~arim/pub/algo/ 事務連絡 : アルゴリズムとデータ構造 H29 授業予定 ( 改訂 ) 2 回 日付 曜内容 担当 1 4 月 6 日木ガイダンス 有村 2 4 月 11 日火アルゴリズムと計算量 有村 3 4 月 13 日木基本的なデータ構造

More information

A Constructive Approach to Gene Expression Dynamics

A Constructive Approach to Gene Expression Dynamics 配列アラインメント (I): 大域アラインメント http://www.lab.tohou.ac.jp/sci/is/nacher/eaching/bioinformatics/ week.pdf 08/4/0 08/4/0 基本的な考え方 バイオインフォマティクスにはさまざまなアルゴリズムがありますが その多くにおいて基本的な考え方は 配列が類似していれば 機能も類似している というものである 例えば

More information

データ構造

データ構造 アルゴリズム及び実習 7 馬青 1 表探索 定義表探索とは 表の形で格納されているデータの中から条件に合ったデータを取り出してくる操作である 但し 表は配列 ( 連結 ) リストなどで実現できるので 以降 表 の代わりに直接 配列 や リスト などの表現を用いる場合が多い 表探索をただ 探索 と呼ぶ場合が多い 用語レコード : 表の中にある個々のデータをレコード (record) と呼ぶ フィールド

More information

Microsoft Word - 中間試験 その1_解答例.doc

Microsoft Word - 中間試験 その1_解答例.doc 問題 1.C 言語 情報技術 Ⅱ 前半中間試験 次の宣言をしている時 以下の問いに答えよ unsigned char moji_1; struct Kouzou { unsigned char code; unsigned char str[10]; }; struct Kouzou mk[3]; 明星大学情報学科 3 年後期 情報技術 Ⅱ 中間試験その 1 Page 1 1-1. 各値を求めよ (1)sizeof(

More information

<4D F736F F F696E74202D2091E6824F82538FCD8CEB82E88C9F8F6F814592F990B382CC8CB4979D82BB82CC82505F D E95848D8682CC90B69

<4D F736F F F696E74202D2091E6824F82538FCD8CEB82E88C9F8F6F814592F990B382CC8CB4979D82BB82CC82505F D E95848D8682CC90B69 第 章 誤り検出 訂正の原理 その ブロック符号とその復号 安達文幸 目次 誤り訂正符号化を用いる伝送系誤り検出符号誤り検出 訂正符号 7, ハミング符号, ハミング符号生成行列, パリティ検査行列の一般形符号の生成行列符号の生成行列とパリティ検査行列の関係符号の訂正能力符号多項式 安達 : コミュニケーション符号理論 安達 : コミュニケーション符号理論 誤り訂正符号化を用いる伝送系 伝送システム

More information

JAVA入門

JAVA入門 JAVA 入門 3 配列とコレクション 配列 1. 配列とは? 簡単 JAVA 説明 11 配列 同じ型の値を複数まとめて記憶する という機能を持つもの ということですが イメージとしては 同じ型の入れ物を複数用意する というイメージです int int int 簡単 JAVA 説明 11 配列の準備 2. 配列の準備 行うことは次の 2 つです 1 配列の宣言 2 配列要素の確保 簡単 JAVA

More information

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile data.txt #define OutFile surted.txt #def C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include #define InFile "data.txt" #define OutFile "surted.txt"

More information

DVIOUT-SS_Ma

DVIOUT-SS_Ma 第 章 微分方程式 ニュートンはリンゴが落ちるのを見て万有引力を発見した という有名な逸話があります 無重力の宇宙船の中ではリンゴは落ちないで静止していることを考えると 重力が働くと始め静止しているものが動き出して そのスピードはどんどん大きくなる つまり速度の変化が現れることがわかります 速度は一般に時間と共に変化します 速度の瞬間的変化の割合を加速度といい で定義しましょう 速度が変化する, つまり加速度がでなくなるためにはその原因があり

More information

Microsoft Word - 微分入門.doc

Microsoft Word - 微分入門.doc 基本公式 例題 0 定義式 f( ) 数 Ⅲ 微分入門 = の導関数を定義式にもとづいて計算しなさい 基本事項 ( f( ), g( ) が微分可能ならば ) y= f( ) g( ) のとき, y = y= f( ) g( ) h( ) のとき, y = ( f( ), g( ) が微分可能で, g( ) 0 ならば ) f( ) y = のとき, y = g ( ) とくに, y = のとき,

More information

プログラミング入門1

プログラミング入門1 プログラミング入門 1 第 5 回 繰り返し (while ループ ) 授業開始前に ログオン後 不要なファイルを削除し て待機してください Java 1 第 5 回 2 参考書について 参考書は自分にあったものをぜひ手元において自習してください 授業の WEB 教材は勉強の入り口へみなさんを案内するのが目的でつくられている これで十分という訳ではない 第 1 回に紹介した本以外にも良書がたくさんある

More information

<4D F736F F D F90948A F835A E815B8E8E8CB189F090E05F8E6C8D5A>

<4D F736F F D F90948A F835A E815B8E8E8CB189F090E05F8E6C8D5A> 06 年度大学入試センター試験解説 数学 Ⅱ B 第 問 () 8 より, 5 5 5 6 6 8 ア, イ また, 底の変換公式を用いると, log 7 log log 9 9 log 7 log ウエ, オ (), のグラフは, それぞれ = 89 = 右図のようになり, この つのグラフは 軸に関して対称 ここで, 0, のとき, と log カ のグラフが直線 に関して対称 であることから,

More information

2011年度 東京大・文系数学

2011年度 東京大・文系数学 東京大学 ( 文系 ) 前期日程問題 解答解説のページへ x の 次関数 f( x) = x + x + cx+ d が, つの条件 f () =, f ( ) =, ( x + cx+ d) dx= をすべて満たしているとする このような f( x) の中で定積分 I = { f ( x) } dx を最小にするものを求め, そのときの I の値を求めよ ただし, f ( x) は f ( x)

More information

模擬試験問題(第1章~第3章)

模擬試験問題(第1章~第3章) 基本情報技術者試験の練習問題 - 第 10 回 この問題は平成 19 年度春期の問題から抜粋しています 問 1 次のプログラムの説明及びプログラムを読んで, 設問 1~3 に答えよ プログラムの説明 整数型の 1 次元配列の要素 A[0],,A[N](N>0) を, 挿入ソートで昇順に整列する副プログラム InsertSort である (1) 挿入ソートの手順は, 次のとおりである (i) まず,A[0]

More information

チェビシェフ多項式の2変数への拡張と公開鍵暗号(ElGamal暗号)への応用

チェビシェフ多項式の2変数への拡張と公開鍵暗号(ElGamal暗号)への応用 チェビシェフ多項式の 変数への拡張と公開鍵暗号 Ell 暗号 への応用 Ⅰ. チェビシェフ Chbhv Chbhv の多項式 より であるから よって ここで とおくと coθ iθ coθ iθ iθ coθcoθ 4 4 iθ iθ iθ iθ iθ i θ i θ i θ i θ co θ co θ} co θ coθcoθ co θ coθ coθ したがって が成り立つ この漸化式と であることより

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 2 回文字列とポインタ 先週のパズルの解説 答え : 全部 p a 1 図の書き方 : p+1 は式であって その値を格納する記憶場所を考えないので 四角で囲まない 2 p+1 同じものを表すいろいろな書き方をしてみましたが パズル以上の意味はありません プログラム中に書くときは p+1 が短くていいんじゃないかな p+1 は 2 の記憶場所 p[1] は 2 に格納されている値

More information

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - C_Programming(3).pptx H23 年度秋学期情報スキル活用 入門 担当 : 田中基彦 ( 工学部共通教育科 ) Email: ak_tanaka@isc.chubu.ac.jp 授業のホームページ学術情報センター > 教育支援 > 情報リテラシー 授業の日程 講義内容提出課題 連絡事項を掲載 > 定期的にアクセスして確認する C 言語によるプログラミング (3) 制御文 繰り返し文 if, while, switch, for,

More information

スライド 1

スライド 1 東北大学工学部機械知能 航空工学科 2015 年度 5 セメスター クラス D 計算機工学 6. MIPS の命令と動作 演算 ロード ストア ( 教科書 6.3 節,6.4 節 ) 大学院情報科学研究科鏡慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ レジスタ間の演算命令 (C 言語 ) c = a + b; ( 疑似的な MIPS アセンブリ言語 )

More information

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ 2-1 / 32 4. 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリティ n を持つ関数記号からなる Σ の部分集合 例 : 群 Σ G = {e, i, } (e Σ

More information

Microsoft PowerPoint - DA1_2018.pptx

Microsoft PowerPoint - DA1_2018.pptx 木の利用例 ( ゲーム木 ) データ構造とアルゴリズム ⅠB 第 回 自分の手番 / 相手の手番で分岐していく 77 例題 二人で交代に,1 から順に までの数を言う. 言う数の個数は,1 個, 個,3 個のいずれか好きなのを選んでよい 最後に を言った方が負け 必勝法 を言って, 相手に順番を回せば絶対勝ち 一方,0 を言って, 相手に順番を回せば, 相手が何個を選んでも, 次に を言える ---

More information

数学 Ⅲ 微分法の応用 大学入試問題 ( 教科書程度 ) 1 問 1 (1) 次の各問に答えよ (ⅰ) 極限 を求めよ 年会津大学 ( 前期 ) (ⅱ) 極限値 を求めよ 年愛媛大学 ( 前期 ) (ⅲ) 無限等比級数 が収束するような実数 の範囲と そのときの和を求めよ 年広島市立大学 ( 前期

数学 Ⅲ 微分法の応用 大学入試問題 ( 教科書程度 ) 1 問 1 (1) 次の各問に答えよ (ⅰ) 極限 を求めよ 年会津大学 ( 前期 ) (ⅱ) 極限値 を求めよ 年愛媛大学 ( 前期 ) (ⅲ) 無限等比級数 が収束するような実数 の範囲と そのときの和を求めよ 年広島市立大学 ( 前期 数学 Ⅲ 微分法の応用 大学入試問題 ( 教科書程度 )1 問 1 (1) 次の各問に答えよ (ⅰ) 極限 を求めよ 年会津大学 ( 前期 ) (ⅱ) 極限値 を求めよ 年愛媛大学 ( 前期 ) (ⅲ) 無限等比級数 が収束するような実数 の範囲と そのときの和を求めよ 年広島市立大学 ( 前期 ) (2) 次の関数を微分せよ (ⅰ) を正の定数とする (ⅱ) (ⅳ) (ⅵ) ( 解答 )(1) 年群馬大学

More information

Microsoft PowerPoint - IntroAlgDs pptx

Microsoft PowerPoint - IntroAlgDs pptx アルゴリズムとデータ構造入門 -3 04 年 月 4 日 大学院情報学研究科知能情報学専攻 http://wiie.kuis.kyoto-u.ac.jp/~okuo/lecture//itroalgds/ okuo@i.kyoto-u.ac.jp,okuo@ue.org if mod( 学籍番号の下 3 桁,3) 0 if mod( 学籍番号の下 3 桁,3) if mod( 学籍番号の下 3 桁,3).

More information

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri 3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ int a, b; b = a % 3; if (b== 0) printf( %d は 3 で割り切れます n, a); if (b == 1) printf( %d を 3 で割った余りは

More information

DVIOUT

DVIOUT 最適レギュレータ 松尾研究室資料 第 最適レギュレータ 節時不変型無限時間最適レギュレータ 状態フィードバックの可能な場合の無限時間問題における最適レギュレータについて確定系について説明する. ここで, レギュレータとは状態量をゼロにするようなコントローラのことである. なぜ, 無限時間問題のみを述べるかという理由は以下のとおりである. 有限時間の最適レギュレータ問題の場合の最適フィードバックゲインは微分方程式の解から構成される時間関数として表現される.

More information

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - kougi7.ppt C プログラミング演習 第 7 回メモリ内でのデータの配置 例題 1. 棒グラフを描く 整数の配列から, その棒グラフを表示する ループの入れ子で, 棒グラフの表示を行う ( 参考 : 第 6 回授業の例題 3) 棒グラフの1 本の棒を画面に表示する機能を持った関数を補助関数として作る #include "stdafx.h" #include void draw_bar( int

More information

gengo1-8

gengo1-8 問題提起その 1 一文字ずつ文字 ( 数字 ) を読み込み それぞれの文字が何回入力されたかを数えて出力するプログラム int code, count_0=0, count_1=0, count_2=0, count_3=0,..., count_9=0; while( (code=getchar())!= EOF ){ } switch(code){ case 0 : count_0++; break;

More information

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile data.txt #define OutFile sorted.txt #def C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include #define InFile "data.txt" #define OutFile "sorted.txt"

More information

3 数値解の特性 3.1 CFL 条件 を 前の章では 波動方程式 f x= x0 = f x= x0 t f c x f =0 [1] c f 0 x= x 0 x 0 f x= x0 x 2 x 2 t [2] のように差分化して数値解を求めた ここでは このようにして得られた数値解の性質を 考

3 数値解の特性 3.1 CFL 条件 を 前の章では 波動方程式 f x= x0 = f x= x0 t f c x f =0 [1] c f 0 x= x 0 x 0 f x= x0 x 2 x 2 t [2] のように差分化して数値解を求めた ここでは このようにして得られた数値解の性質を 考 3 数値解の特性 3.1 CFL 条件 を 前の章では 波動方程式 f x= x = f x= x t f c x f = [1] c f x= x f x= x 2 2 t [2] のように差分化して数値解を求めた ここでは このようにして得られた数値解の性質を 考える まず 初期時刻 t=t に f =R f exp [ik x ] [3] のような波動を与えたとき どのように時間変化するか調べる

More information

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (

More information

Microsoft PowerPoint - mp13-07.pptx

Microsoft PowerPoint - mp13-07.pptx 数理計画法 ( 数理最適化 ) 第 7 回 ネットワーク最適化 最大流問題と増加路アルゴリズム 担当 : 塩浦昭義 ( 情報科学研究科准教授 ) hiour@di.i.ohoku.c.jp ネットワーク最適化問題 ( 無向, 有向 ) グラフ 頂点 (verex, 接点, 点 ) が枝 (edge, 辺, 線 ) で結ばれたもの ネットワーク 頂点や枝に数値データ ( 距離, コストなど ) が付加されたもの

More information