Guest User

Untitled

a guest
Dec 11th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. module Heap (Heap(Empty, Node), getValue, insert, pop, fromList) where
  2.  
  3. import Prelude hiding (foldl, foldr)
  4. import Data.Foldable
  5. import Data.Monoid
  6.  
  7. data Heap a = Empty | Node (Heap a) a (Heap a)
  8.  
  9. instance (Show a) => Show (Heap a) where
  10. show Empty = "E"
  11. show (Node lh a rh) = "( " ++ show a ++ " ( L = " ++ show lh ++ " ) " ++ " ( R = " ++ show rh ++ " ) )"
  12.  
  13. instance Foldable Heap where
  14. foldMap _ Empty = mempty
  15. foldMap f (Node l a r) = f a `mappend` foldMap f l `mappend` foldMap f r
  16. foldr _ z Empty = z
  17. foldr f z (Node Empty a Empty) = f a z
  18. foldr f z (Node l a r) = f a (foldr f (foldr f z r) l)
  19.  
  20. getValue :: Heap a -> a
  21. getValue Empty = undefined
  22. getValue (Node _ a _) = a
  23.  
  24. insert :: Ord a => a -> Heap a -> Heap a
  25. insert x h = arrange $ _insert x h
  26.  
  27. _insert :: Ord a => a -> Heap a -> Heap a
  28. _insert x Empty = Node Empty x Empty
  29. _insert x (Node Empty a Empty) = Node (Node Empty x Empty) a Empty
  30. _insert x (Node Empty a r) = Node (Node Empty x Empty) a r
  31. _insert x (Node l a Empty) = Node l a (Node Empty x Empty)
  32. _insert x (Node l a r) = Node l a (_insert x r)
  33.  
  34. arrange :: Ord a => Heap a -> Heap a
  35. arrange Empty = Empty
  36. arrange (Node Empty a Empty) = Node Empty a Empty
  37. arrange (Node Empty a r) = let (Node rl rv rr) = arrange r
  38. in if a <= rv
  39. then Node Empty a (Node rl rv rr)
  40. else Node Empty rv (arrange $ Node rl a rr)
  41. arrange (Node l a Empty) = let (Node ll lv lr) = arrange l
  42. in if a <= lv
  43. then Node (Node ll lv lr) a Empty
  44. else Node (arrange $ Node ll a lr) lv Empty
  45. arrange (Node l a r) = let ar = arrange r
  46. al = arrange l
  47. in replace al a ar
  48. where
  49. replace (Node ll lv lr) a' (Node rl rv rr)
  50. | a <= lv && a <= rv = Node (arrange $ Node ll lv lr) a' (arrange $ Node rl rv rr)
  51. | a > lv && a <= rv = Node (arrange $ Node ll a' lr) lv (Node rl rv rr)
  52. | a <= lv && a > rv = Node (Node ll lv lr) rv (arrange $ Node rl a' rr)
  53. | a > lv && a > rv && lv >= rv = Node (Node ll lv lr) rv (arrange $ Node rl a' rr)
  54. | otherwise = Node (arrange $ Node ll a' lr) lv (Node rl rv rr)
  55. replace _ _ _ = undefined
  56.  
  57. fromList :: Ord a => [a] -> Heap a
  58. fromList = foldl (flip insert) Empty
  59.  
  60. maxValue :: Ord a => Heap a -> a
  61. maxValue (Node Empty a Empty) = a
  62. maxValue (Node l _ Empty) = maxValue l
  63. maxValue (Node Empty _ r) = maxValue r
  64. maxValue (Node l _ r) = max (maxValue l) (maxValue r)
  65. maxValue _ = undefined
  66.  
  67. removeMaxValue :: Ord a => Heap a -> Heap a
  68. removeMaxValue Empty = undefined
  69. removeMaxValue (Node Empty _ Empty) = Empty
  70. removeMaxValue (Node l@(Node _ _ _) a Empty) = Node (removeMaxValue l) a Empty
  71. removeMaxValue (Node Empty a r@(Node _ _ _)) = Node Empty a (removeMaxValue r)
  72. removeMaxValue (Node l@(Node _ _ _) a r@(Node _ _ _))
  73. | maxValue l <= maxValue r = Node l a (removeMaxValue r)
  74. | otherwise = Node (removeMaxValue l) a r
  75.  
  76. pop :: Ord a => Heap a -> (Maybe a, Heap a)
  77. pop Empty = (Nothing, Empty)
  78. pop (Node Empty a Empty) = (Just a, Empty)
  79. pop (Node l a Empty) = (Just a, l)
  80. pop (Node Empty a r) = (Just a, r)
  81. pop (Node l a r) = (Just a, arrange heap)
  82. where
  83. heap
  84. | maxValue l <= maxValue r = let rv = maxValue r
  85. in Node l rv (removeMaxValue r)
  86. | otherwise = let lv = maxValue l
  87. in Node (removeMaxValue l) lv r
Add Comment
Please, Sign In to add comment