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

PFDS Reading Chapter2

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

PFDS Reading Chapter2

Avatar for Shintaro Murakami

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