Речник АТД
Function |
Input |
Output |
Description |
size() |
- |
Integer |
Връща броя на елементите
на D. |
isEmpty() |
- |
Boolean |
Проверява дали D е празен. |
elements() |
- |
Iterator of objects
(elements) |
Връща елементите,
записани в D. |
keys() |
- |
Iterator of objects (keys) | Връща ключовете, записани в D. |
find(k) |
Object (key) | Position |
Ако D съдържа член с
ключ, равен на k,
връща позицията на този член. Ако не, връща nullposition . |
findAll(k) |
Object (key) | Iterator of Positions | Връща итератор от
позициите на всички членове, чийто ключове са равни на k. |
insertItem(k,e) |
Objects k (key) and e (element) | - |
Вмъква двойка с елемент
e и ключ k в D. |
removeElement(k) |
Object (key) |
- |
Премахва член с ключ
равен на k
от D. Ако в D няма такъв член се
генерира грешка (error condition). |
removeAllElements(k) |
Object (key) | - |
Премахва всички двойки с ключове равни на k от D. |
Operation |
Output |
Dictionary |
insertItem(5,A) insertItem(7,B) insertItem(2,C) insertItem(8,D) insertItem(2,E) find(7) find(4) find(2) findAll(2) size() removeElement(5) removeElement(5) removeAllElements(2) find(2) findAll(2) |
- - - - - p(B) "null" p(C) or p(E) p(C),p(E) 5 - "error" - "null" "empty iterator" |
{(5,A)} {(5,A),(7,B)} {(5,A),(7,B),(2,C)} {(5,A),(7,B),(2,C),(8,D)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(5,A),(7,B),(2,C),(8,D),(2,E)} {(7,B),(2,C),(8,D),(2,E)} {(7,B),(2,C),(8,D),(2,E)} {(7,B),(8,D)} {(7,B),(8,D)} {(7,B),(8,D)} |
Operation |
Input |
Output |
Description |
element() | - |
Object (element) | Връща псевдоним на
елемента от двойката на тази позиция. |
key() | - |
Object (key) | Връща константен псевдоним на ключа от двойката на тази позиция. |
isNull() | - |
Boolean |
Връща true,
ако това е nullposition. |
Пример: Речник, състоящ се от (FN, name) -
факултетен номер и име на студент, като речникът съхранява данни
за студентите от този курс - n = 100, N = 100000.
|
int hashCode(int x)64-bit integer if we have 32-bit integer hash function
{ return x; }
int hashCode(long x)Полиномен хеш код
{ typedef unsigned long ulong;
return hashCode(static_cast<int>(static_cast<ulong>(x) >> 32)
+ static_cast<int>(x));
}
Експериментални резултати за 25000 английски думиint hashCode(const char* p, int len) // hash a character array
{ unsigned int h = 0;
for (int i = 0; i < len; i++)
{ h = (h << 5)|(h >> 27); // 5-bit cyclic shift
h += (unsigned int)p[i]; // add in next character
}
return hashCode(int(h));
}
Shift |
Collisions Total |
Collisions Max |
0 |
23739 |
86 |
1 |
10517 |
21 |
5 |
4 |
2 |
6 |
6 |
2 |
11 |
453 |
4 |
hash_code.cppint hashCode(const double& x) // hash a double
{ int len = sizeof(x);
const char* p = reinterpret_cast<const char *>(&x);
return hashCode(p, len);
}
|
|
Algorithm
find(k) i ← h(k) p ← 0 repeat c ← A[i] if c = ∅ return Position(null) else if c.key() = k return Position(c) else i ← (i + 1) mod N p ← p + 1 until p = N return Position(null) |
|
Function |
Log File |
Lookup Table |
size(),
isEmpty() |
O(1) |
O(1) |
keys(),
elements() |
O(n) |
O(n) |
find(key) |
O(n) |
O(log n) |
findAll(key) |
Theta(n) |
O(log n
+ s) |
insertItem(key,
element) |
O(1) |
O(n) |
removeElement(key) |
O(n) |
O(n) |
removeAllElements() |
Theta(n) | O(n) |