-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHashtable.h
159 lines (138 loc) · 3.27 KB
/
Hashtable.h
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/**
* Copyright 2018
*
* Fișier header cu definiția clasei tabelului de dispersie.
*/
#ifndef HASHTABLE_H_
#define HASHTABLE_H_
// Biblioteci
#include <iterator>
#include <vector>
// Declarări using
using std::vector;
// Structura unui element din tabel
template <typename Tkey, typename Tvalue>
struct elem_info {
Tkey key;
Tvalue value;
};
template <typename Tkey, typename Tvalue>
class Hashtable {
private:
// Pointer către grupări
vector< struct elem_info<Tkey, Tvalue> > *H;
// Numărul maxim de grupări
int HMAX;
// Pointer către funcția de hash
unsigned int (*hash)(Tkey);
// Numărul de elemente din tabelul de dispersie.
unsigned int size;
// Iteratorul prin liste
typename vector< struct elem_info<Tkey, Tvalue> >::iterator it;
public:
// Constructor
Hashtable(int HMAX, unsigned int (*hash)(Tkey)) {
// Funcția de hash
this->hash = hash;
// Capacitatea maximă este HMAX bucketuri.
this->HMAX = HMAX;
// Se alocă bucketurile.
this->H = new vector< struct elem_info<Tkey, Tvalue> > [HMAX];
// Mărimea inițială este 0, niciun element nu este în tabel.
this->size = 0;
}
// Destructor
~Hashtable() {
delete[] H;
}
/**
* Metoda de adăugare în tabel
*/
void put(Tkey key, Tvalue value) {
/**
* Pentru fiecare element, pentru orice metodă legată de tabel, se va
* calcula indexul utilizând funcția de hash.
*/
int index = hash(key) % HMAX;
/**
* În cazul în care cheia exsită deja în tabel, valoarea asociată
* acesteia este modificată.
*/
for (it = H[index].begin(); it != H[index].end(); ++it) {
if (it->key == key) {
it->value = value;
return;
}
}
// Dacă nu există deja în tabel, cheia este adăugată.
struct elem_info<Tkey, Tvalue> info = {.key = key, .value = value};
H[index].push_back(info);
/**
* Se crește numărul de elemente din tabel doar dacă se adaugă o cheie
* nouă.
*/
++size;
}
/**
* Metoda de eliminare a unei chei din tabel.
*/
void remove(Tkey key) {
int index = hash(key) % HMAX;
// Se caută cheia și se șterge, alături de valoarea asociată.
for (it = H[index].begin(); it != H[index].end(); ++it) {
if (it->key == key) {
it = H[index].erase(it);
// Se scade numărul de elemente.
--size;
}
}
}
/**
* Metoda de căutare a cheii în tabel
*
* @retureneză valoarea asociată.
*/
Tvalue get(Tkey key) {
int index = hash(key) % HMAX;
// Dacă există în tabel cheia, se returnează valoarea asociată.
for (it = H[index].begin(); it != H[index].end(); ++it) {
if (it->key == key) {
return it->value;
}
}
return Tvalue();
}
/**
* Verică dacă există cheia în tabel.
*
* @returnează adevărat dacă exsistă, fals în caz contrar.
*/
bool has_key(Tkey key) {
int index = hash(key) % HMAX;
for (it = H[index].begin(); it != H[index].end(); ++it) {
if (it->key == key) {
return true;
}
}
return false;
}
/**
* Întoarce dimensiunea tabelului de dispersie.
*/
int get_size() {
return size;
}
/**
* Întoarce capacitatea tabelului.
*/
int get_capacity() {
return HMAX;
}
/**
* Întoarce factorul de dispersie al tabelului.
*/
float current_factor(){
return (float)(size) / (float)(HMAX);
}
};
#endif // HASHTABLE_H_