-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path20150325.hs
75 lines (59 loc) · 2.19 KB
/
20150325.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
type Key = Int
type Objeto = (Key,String)
type HashTable = [Objeto]
baseTable :: HashTable
baseTable = []
initTable:: HashTable->Int-> HashTable
initTable ht sz | sz == 100 = ht
| otherwise = initTable ((-1,""):ht) (sz+1)
hash::Int->Int->Int
hash k m = (k) `mod` m
checkNext :: Int->Int->HashTable->Int
checkNext k v ht| k == (fst (ht!!v)) = v
| (hash k 100) == v = -1
| otherwise = checkNext k ((v+1) `mod` 100) ht
get:: Key->HashTable->String
get k ht | k == (fst (ht!!v)) = (snd (ht!!v))
| (checkNext k (v+1) ht) == -1 = "key invalida"
| otherwise = snd (ht!!(checkNext k (v+1) ht))
where v = ((hash k 100))
nextAvailabe:: Int->Int->Int->HashTable->Int
nextAvailabe k v e h | -1 == (fst (h!!v)) || k == (fst (h!!v))= v
| v == e = -1
| otherwise = (nextAvailabe k ((v+1) `mod` 100) e h)
put:: Key->String->HashTable->HashTable
put k s ht | -1 == (fst (ht!!mk)) || k ==(fst (ht!!mk)) = (take (mk) ht) ++ (k,s):(drop (mk+1) ht)
| nb == -1 = ht
| otherwise = (take (nb) ht) ++ (k,s):(drop (nb+1) ht)
where mk = ((hash k 100))
nb = (nextAvailabe k (mk+1) mk ht)
remove::Key->HashTable->HashTable
remove k ht | k == (fst (ht!!v)) = (take (v) ht) ++ (-1,""):(drop (v+1) ht)
| (checkNext k (v+1) ht) == -1 = ht
| otherwise = (take (na) ht) ++ (-1,""):(drop (na+1) ht)
where v = (hash k 100)
na = (checkNext k (v+1) ht)
hasKey:: Key->HashTable->Bool
hasKey k [] = False
hasKey k (x:xs) | k==(fst x) =True
| otherwise = (hasKey k xs)
-------------CONJUNTOS
haveElement :: (Eq t)=>t->[t]->Bool
haveElement a [] = False;
haveElement a (s:xs) | a==s = True
| otherwise = haveElement a xs
contem:: (Eq t) => [t]->[t]->Bool
contem a [] = True
contem a (b:xb) = (haveElement b a) && (contem a xb)
intersecta:: (Eq t) => [t]->[t]->Bool
intersecta a [] = False
intersecta a (b:xb) = (haveElement b a) || (intersecta a xb)
comparaConjuntos ::(Eq t) => [t]->[t] ->String
comparaConjuntos a b | cab && cba = "A igual B"
| cab = "A contem B"
| cba = "B contem A"
| iab = "A interseciona B"
| otherwise = "Conjuntos Disjuntos"
where cab = (contem a b)
cba = (contem b a)
iab = (intersecta a b)