Advertisement
tomasfdel

Estructuras II Práctica 5

May 22nd, 2018
555
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- EJERCICIO 1
  2. -- CALCULAR TRABAJO Y PROFUNDIDAD
  3.  
  4. data BTree a = Empty | Node Int (BTree a) a (BTree a) deriving Show
  5.  
  6. -- Suponemos que lo hace de manera consciente.
  7.  
  8. sizeBT :: BTree a -> Int
  9. sizeBT Empty = 0
  10. sizeBT (Node size _ _ _) = size
  11.  
  12. nth :: BTree a -> Int -> a
  13. nth (Node size l d r) indice | indice < sizeL  = nth l indice
  14.                              | indice == sizeL = d
  15.                              | otherwise       = nth r (indice - sizeL - 1)
  16.                              where sizeL = sizeBT l
  17.                              
  18. cons :: a -> BTree a -> BTree a
  19. cons dato Empty = Node 1 Empty dato Empty
  20. cons dato (Node size l d r) = Node (size + 1) (cons dato l) d r
  21.  
  22. tabulateAux :: (Int -> a) -> Int -> Int -> BTree a
  23. tabulateAux f 0 _ = Empty
  24. tabulateAux f numero offset | (mod numero 2) == 0 = let mitadI = div numero 2
  25.                                                         mitadD = (div numero 2) - 1
  26.                                                         tabI = tabulateAux f mitadI offset
  27.                                                         dato = f (mitadI + offset)
  28.                                                         tabD = tabulateAux f mitadD (offset + mitadI + 1)
  29.                                                     in (Node numero tabI dato tabD)
  30.                             | otherwise           = let mitad = div numero 2
  31.                                                         tabI = tabulateAux f mitad offset
  32.                                                         dato = f (mitad + offset)
  33.                                                         tabD = tabulateAux f mitad (offset + mitad + 1)
  34.                                                     in (Node numero tabI dato tabD)
  35.  
  36. tabulate :: (Int -> a) -> Int -> BTree a
  37. tabulate f numero = tabulateAux f numero 0
  38.  
  39. mapBT :: (a -> b) -> BTree a -> BTree b
  40. mapBT f Empty = Empty
  41. mapBT f (Node size l d r) = Node size mapL (f d) mapR
  42.                             where mapL = mapBT f l
  43.                                   mapR = mapBT f r
  44.  
  45. takeBT :: Int -> BTree a -> BTree a
  46. takeBT n Empty = Empty
  47. takeBT 0 _ = Empty
  48. takeBT n (Node size l d r) | n <= sizeL  = takeBT n l
  49.                            | n == (sizeL + 1) = Node n l d Empty
  50.                            | otherwise  = Node (min size n) l d (takeBT (n - sizeL - 1) r)
  51.                            where sizeL = sizeBT l
  52.  
  53. dropBT :: Int -> BTree a -> BTree a
  54. dropBT n Empty = Empty
  55. dropBT n (Node size l d r) | n <= sizeL  = Node (size - n) (dropBT n l) d r
  56.                            | n == (sizeL + 1) = r
  57.                            | otherwise  = dropBT (n - sizeL - 1) r
  58.                            where sizeL = sizeBT l
  59.  
  60. -- EJERCICIO 2
  61. -- FALTA DEMOSTRAR
  62.  
  63. data Tree a = E | Leaf a | Join (Tree a) (Tree a)
  64.  
  65. mapreduce :: (a -> b) -> (b -> b -> b) -> b -> Tree a -> b
  66. mapreduce f g e = mr where mr E          = e
  67.                            mr (Leaf x)   = f x
  68.                            mr (Join l r) = g (mr l) (mr r)
  69.  
  70.  
  71. fMap :: Int -> (Int, Int, Int, Int)
  72. fMap x = (x, max x 0, max x 0, max x 0)
  73.  
  74. fRed :: (Num a, Ord a) => (a, a, a, a) -> (a, a, a, a) -> (a, a, a, a)
  75. fRed (mSumL,mPrefL,mSufL,sumL) (mSumR,mPrefR,mSufR,sumR) = let mSumT = max (max mSumL mSumR) (mSufL + mPrefR)
  76.                                                                mPrefT = max mPrefL (sumL + mPrefR)
  77.                                                                mSufT = max mSufR (mSufL + sumR)
  78.                                                                sumT = sumL + sumR
  79.                                                             in (mSumT, mPrefT, mSufT, sumT)
  80.  
  81.  
  82. mcssAux :: Tree Int -> (Int,Int,Int,Int)
  83. mcssAux tree = mapreduce fMap fRed casoBase tree
  84.                          where casoBase = (minBound, 0, 0, 0)
  85.                          
  86. mcss :: Tree Int -> Int
  87. mcss t = let (a,b,c,d) = mcssAux t
  88.          in a
  89.  
  90.  
  91.  
  92. --EJERCICIO 3
  93. data Tree a = E | Leaf a | Join (Tree a) (Tree a) deriving Show
  94.  
  95. reduceT :: (a -> a -> a) -> a -> Tree a -> a
  96. reduceT f e E = e
  97. reduceT f e (Leaf x) = x
  98. reduceT f e (Join l r) = f (reduceT f e l) (reduceT f e r)
  99.  
  100. mapreduce :: (a -> b) -> (b -> b -> b) -> b -> Tree a -> b
  101. mapreduce f g e = mr where mr E          = e
  102.                            mr (Leaf x)   = f x
  103.                            mr (Join l r) = g (mr l) (mr r)
  104.                            
  105.  
  106. smartJoin :: Tree Int -> Tree Int -> Tree Int
  107. smartJoin t1 E = t1
  108. smartJoin t1 t2 = Join t1 t2
  109.  
  110.  
  111. sufijosAux :: Tree Int -> Tree Int -> (Tree (Int, Tree Int), Tree Int)
  112. sufijosAux E tAcum = (Leaf (0, tAcum) , tAcum) -- Tipo correcto.
  113. sufijosAux (Leaf x) tAcum = (Leaf (x, tAcum), tRes) where tRes = (smartJoin (Leaf x) tAcum)  -- Tipo correcto.
  114. sufijosAux (Join l r) tAcum = (Join hijoIzq hijoDer, acumIzq) --lI y lD deben ser Tree (Int, Tree Int)
  115.                                where (hijoDer, acumDer) = sufijosAux r tAcum
  116.                                      (hijoIzq, acumIzq) = sufijosAux l acumDer
  117.  
  118.  
  119.  
  120. conSufijos :: Tree Int -> Tree (Int, Tree Int)
  121. conSufijos tree = t1 where (t1, _) = sufijosAux tree E
  122.  
  123. maxT :: Tree Int -> Int
  124. maxT tree = reduceT max 0 tree
  125.  
  126. maxVenta :: (Int, Tree Int) -> Int
  127. maxVenta (compra, arbolVentas) = (maxT arbolVentas) - compra
  128.  
  129. maxAll :: Tree (Int, Tree Int) -> Int
  130. maxAll tree = mapreduce maxVenta max 0 tree
  131.  
  132.  
  133. mejorGanancia :: Tree Int -> Int
  134. mejorGanancia tree = maxAll (conSufijos tree)
  135.  
  136.  
  137. ej = Join (Join (Leaf 10) (Leaf 150)) (Leaf 20) :: Tree Int
  138. ej2 = Join (Join (Join (Leaf 5) (Leaf 3) ) (Join (Leaf 4) (Leaf 1))) (Leaf 5) :: Tree Int
  139.  
  140.  
  141.  
  142. -- EJERCICIO 4
  143. data T a = E | N (T a) a (T a)
  144.  
  145. altura :: T a -> Int
  146. altura E = 0
  147. altura (N l x r ) = 1 + max (altura l , altura r )
  148.  
  149. seekAndDestroy :: T a -> (T a, a)
  150. seekAndDestroy (N E d E) = (E, d)
  151. seekAndDestroy (N E d r) = (r, d)
  152. seekAndDestroy (N l d r) = ((N arbolNuevo d r), raiz) where (arbolNuevo, raiz) = seekAndDestroy l
  153.  
  154. combinar :: T a -> T a -> T a
  155. combinar t1 E = t1
  156. combinar E t2 = t2
  157. combinar (N l d E) t2 = N l d t2
  158. combinar (N E d r) t2 = N t2 d r
  159. combinar t1@(N l d r) t2 = N nuevot1 nuevaRaiz t2 where (nuevot1, nuevaRaiz) = seekAndDestroy t1
  160.  
  161. combinarCeci :: T a -> T a -> T a
  162. combinarCeci E t = t
  163. combinarCeci (Node l d r) t = Node t d (combinar l r)
  164.  
  165.  
  166. filterT :: (a -> Bool) -> T a -> T a
  167. filterT pred E = E
  168. filterT pred (N l d r) = if (pred d) then N (filterT l) d (filterT r)
  169.                                      else combinar (filterT l) (filterT r)
  170.  
  171. -- Estoy convencido que se debe poder hacer más fácil, pero anda
  172. filterT2 :: (a -> Bool) -> T a -> (T a, T a)
  173. filterT2 pred E = (E, E)
  174. filterT2 pred (N l d r) = let (lMenores, lMayores) = filterT2 pred l
  175.                               (rMenores, rMayores) = filterT2 pred r
  176.                          in if (pred d) then (N lMenores d rMenores, combinar lMayores rMayores)
  177.                                         else (combinar lMenores rMenores, N lMayores d rMayores)
  178.  
  179. quickSortT :: T Int -> T Int
  180. quickSortT E = E
  181. quickSortT tree@(N l d r) = let (N ll d' rr, right) = filterT2 (\x -> x <= d) tree
  182.                            in N (quickSortT (combinar ll rr)) d (quickSortT right)
  183.  
  184.  
  185.  
  186.  
  187. -- EJERCICIO 5
  188. {-
  189. Para agregar control de casos ilegales, agregar esto al principio de la guarda:
  190. | n < 0 = (E, raiz)
  191. | n >= size = (raiz, E)
  192. -}
  193. splitAtBT :: BTree a -> Int -> (BTree a, BTree a)
  194. splitAtBT Empty n = (Empty, Empty)
  195. splitAtBT raiz@(Node size l d r) n | n <= sizeL = let (mitadI, mitadD) = splitAtBT l n
  196.                                                  in (mitadI, Node (size - n) mitadD d r)
  197.                                   | n == (sizeL + 1) = (Node n l d Empty, r)
  198.                                   | otherwise = let (mitadI, mitadD) = splitAtBT r (n - sizeL - 1)
  199.                                                 in (Node n l d mitadI, mitadD)
  200.                                   where sizeL = sizeBT l
  201.  
  202. ej1 = Node 7 (Node 3 (Node 1 Empty 1 Empty) 2 (Node 1 Empty 3 Empty)) 4 (Node 3 (Node 1 Empty 5 Empty) 6 (Node 1 Empty 7 Empty)) :: BTree Int
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement