Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PFDS Reading Chapter2

PFDS Reading Chapter2

Shintaro Murakami

July 03, 2017
Tweet

Other Decks in Programming

Transcript

  1. リスト c l a s s S t a c

    k s w h e r e e m p t y : : s a i s E m p t y : : s a ‐ > B o o l c o n s : : a ‐ > s a ‐ > s a h e a d : : s a ‐ > a t a i l : : s a ‐ > s a i n s t a n c e S t a c k [ ] w h e r e e m p t y = [ ] i s E m p t y [ ] = T r u e i s E m p t y _ = F a l s e c o n s x [ ] = [ x ] c o n s x y = x : y h e a d [ ] = e r r o r " h e a d e m p t y " h e a d ( x : x s ) = x t a i l [ ] = e r r o r " t a i l e m p t y " t a i l ( x : x s ) = x s
  2. ++ ( + + ) : : S t a

    c k s = > s a ‐ > s a ‐ > s a s 1 + + s 2 | i s E m p t y s 1 = s 2 | o t h e r w i s e = c o n s ( h e a d s 1 ) ( t a i l s 1 + + s 2 ) ( + + ) : : [ a ] ‐ > [ a ] ‐ > [ a ] [ ] + + a s 2 = a s 2 ( a : a s 1 ) + + a s 2 = a : ( a s 1 + + a s 2 ) 変更前と変更後でas2 は共有
  3. update u p d a t e : : S

    t a c k s = > s a ‐ > I n t ‐ > a ‐ > s a u p d a t e s n a | i s E m p t y s = u n d e f i n e d | n = = 0 = c o n s a ( t a i l s ) | o t h e r w i s e = c o n s ( h e a d s ) ( u p d a t e ( t a i l s ) ( n ‐ 1 ) a ) u p d a t e : : [ a ] ‐ > I n t ‐ > a ‐ > [ a ] u p d a t e [ ] _ _ = u n d e f i n e d u p d a t e ( _ : a s ) 0 a = a : a s u p d a t e ( a ' : a s ) n a = a ' : ( u p d a t e a s ( n ‐ 1 ) a ) 変更前と変更後でn 番目以降の要素は共有
  4. 演習2.1 Q: s u f f i x e s

    [ 1 , 2 , 3 , 4 ] = [ [ 1 , 2 , 3 , 4 ] , [ 2 , 3 , 4 ] , [ 3 , 4 ] , [ 4 ] , [ ] ] を実装せよ A: s u f f i x e s : : [ a ] ‐ > [ [ a ] ] s u f f i x e s [ ] = [ [ ] ] s u f f i x e s l @ ( _ : t ) = l : s u f f i x e s ( t )
  5. 二分探索木 d a t a T r e e a

    = E | T ( T r e e a ) a ( T r e e a ) d e r i v i n g ( S h o w ) a は全順序付けられなければならない Haskell 的には O r d のinstance ML における F u n c t o r はHaskell の F u n c t o r とは違うっぽい?
  6. member m e m b e r : : O

    r d a = > a ‐ > T r e e a ‐ > B o o l m e m b e r a E = F a l s e m e m b e r a ( T l e r ) | a = = e = T r u e | a < e = m e m b e r a l | o t h e r w i s e = m e m b e r a r
  7. 演習2.2 Q: member 関数において、 比較回数を 2 d ‑> d +

    1 に変更せよ。 A: m e m b e r _ E = F a l s e m e m b e r a t @ ( T _ a ' _ ) = m e m b e r ' a ' t w h e r e m e m b e r ' a ' E = a = = a ' m e m b e r ' a ' ( T l a ' ' r ) | a < = a ' ' = m e m b e r ' a ' ' l | o t h e r w i s e = m e m b e r ' a ' r
  8. 演習2.2 比較時に < = を満たす場合、 等しい可能性があるので覚えておく。 次 に < =

    を満たすものが出た場合、 そちらに更新する。 例: m e m b e r 5 の場合
  9. insert i n s e r t : : O

    r d a = > a ‐ > T r e e a ‐ > T r e e a i n s e r t a E = T E a E i n s e r t a t @ ( T l e r ) | a = = e = t | a < e = T ( i n s e r t a l ) e r | o t h e r w i s e = T l e ( i n s e r t a r )
  10. 演習2.3 Q: すでに含まれる要素をinsert した場合、 探索経路全体をコピー し てしまう。 例外を用いてこれを避けよ。 A: i

    m p o r t D a t a . M a y b e i n s e r t : : O r d a = > a ‐ > T r e e a ‐ > M a y b e ( T r e e a ) i n s e r t a E = J u s t $ T E a E i n s e r t a t @ ( T l e r ) | a = = e = N o t h i n g | a < e = f m a p ( \ l ‐ > T l e r ) ( i n s e r t a l ) | o t h e r w i s e = f m a p ( \ r ‐ > T l e r ) ( i n s e r t a r ) 挿入あたり1 つだけ設置するようにすればよい とは...
  11. 演習2.4 Q: 不要なコピー をせず、 比較回数が d + 1 回以下のinsert を作成せ

    よ。 A: i n s e r t a E = J u s t $ T E a E i n s e r t a t @ ( T l a ' r ) = i n s e r t ' a ' t w h e r e i n s e r t ' a ' E = i f a = = a ' t h e n N o t h i n g e l s e J u s t $ T E a i n s e r t ' a ' ( T l a ' ' r ) | a < = a ' ' = f m a p ( \ l ‐ > T l a ' ' r ) ( i n s e r t ' a ' ' l ) | o t h e r w i s e = f m a p ( \ r ‐ > T l a ' ' r ) ( i n s e r t ' a ' r )
  12. 演習2.5(a) Q: 深さn, 全ての要素がa である完全二分木を作成するcomplete を 作成せよ。 A: c o

    m p l e t e : : a ‐ > I n t ‐ > T r e e a c o m p l e t e a 0 = E c o m p l e t e a n = l e t b = c o m p l e t e a ( n ‐ 1 ) i n T b a b
  13. 演習2.5(b) Q: サイズ( ノー ドの数と認識しました) がn の平衡木を作成する関数 を作成せよ。 A: c

    r e a t e : : a ‐ > I n t ‐ > T r e e a c r e a t e a 0 = E c r e a t e a 1 = T E a E c r e a t e a n | o d d n = l e t t = c r e a t e a ( ( n ‐ 1 ) ` d i v ` 2 ) i n T t a t | o t h e r w i s e = l e t m = ( n ‐ 1 ) ` d i v ` 2 b 1 = c r e a t e a ( m + 1 ) b 2 = c r e a t e a m i n T b 1 a b 2
  14. 演習2.6 c l a s s F i n i

    t e M a p m w h e r e e m p t y : : m k a b i n d : : O r d k = > k ‐ > a ‐ > m k a ‐ > M a y b e ( m k a ) l o o k u p : : O r d k = > k ‐ > m k a ‐ > M a y b e a d a t a M a p T r e e k a = M E | M T ( M a p T r e e k a ) k a ( M a p T r e e k a ) d e r i v i n g ( i n s t a n c e F i n i t e M a p M a p T r e e w h e r e e m p t y = M E b i n d k a t @ ( M T l k ' a ' r ) = b i n d ' ( k ' , a ' ) t w h e r e b i n d ' ( k ' , a ' ) M E = i f k = = k ' t h e n N o t h i n g e l s e J u s t $ M T b i n d ' k v ( M T l k ' a ' r ) | k < = k ' = f m a p ( \ l ‐ > M T l k ' a ' r ) ( b i n d ' ( k ' , a ' ) l ) | o t h e r w i s e = f m a p ( \ r ‐ > M T l k ' a ' r ) ( b i n d ' k v r ) l o o k u p k t @ ( M T l k ' a r ) = l o o k u p ' ( k ' , a ) t w h e r e l o o k u p ' ( k ' , a ) M E = i f k = = k ' t h e n J u s t a e l s e N o t h i n g l o o k u p ' k v ( M T l k ' a r ) | k < = k ' = l o o k u p ' ( k ' , a ) l | o t h e r w i s e = l o o k u p ' k v r