-
Notifications
You must be signed in to change notification settings - Fork 0
/
HashTable2.h
119 lines (103 loc) · 2.39 KB
/
HashTable2.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
#pragma once
#ifndef HASHMAP_2_H
#define HASHMAP_2_H
#include "HashTable.h"
#include <iostream>
#include <vector>
using namespace std;
template<class HashedObj>
class HashTable2 {
public:
explicit HashTable2(int size = 3) :array(size),currentSize(0){};//实际情况使用素数
bool contains(const HashedObj& x) const {
return isAlive(findPos(x));
};
void makeEmpty() {
currentSize = 0;
for (HashEntry& entry : array) {
entry.info = EMPTY;
}
};
bool insert(const HashedObj& x) {
int currentPos = findPos(x);
if (isActive(currentPos)) {
return false;
}
array[currentPos].element = x;
array[currentPos].info = ACTIVE;
if (++currentSize >= array.size() * 0.5) {
rehash();
}
return true;
};
bool insert(HashedObj&& x) {
int currentPos = findPos(x);
if (isActive(currentPos)) {
return false;
}
array[currentPos].element = std::move(x);
array[currentPos].info = ACTIVE;
if (++currentSize >= array.size() * 0.5) {
rehash();
}
return true;
};
bool remove(const HashedObj& x) {
int currentPos = findPos(x);
if (!isActive(currentPos)) {
return false;
}
array[currentPos].info = DELETED;
return true;
};
void show() {
for (auto& i : array) {
if (i.info == ACTIVE) {
cout << i.element << ' ';
}
}
cout << endl;
}
enum EntryType{ACTIVE,EMPTY,DELETED};
private:
struct HashEntry {
HashedObj element;
EntryType info;
HashEntry(const HashedObj& e=HashedObj(), EntryType i = EMPTY) :element(e), info(i) {};
HashEntry(HashedObj&& e, EntryType i = EMPTY) :element(std::move(e)), info(i) {};
};
vector<HashEntry> array;
int currentSize;
bool isActive(int currentPos) const {
return array[currentPos].info == ACTIVE;
};
int findPos(const HashedObj& x) const {
int offset = 1;
int currentPos = myhash(x);
while (array[currentPos].info != EMPTY && array[currentPos].element != x) {
currentPos += offset;
offset += 2;
if (currentPos >= array.size())
currentPos -= array.size();
}
return currentPos;
};
void rehash(){
vector<HashEntry> oldArray = array;
array.resize(2 * oldArray.size() + 3);//实际情况用素数
for (auto& entry : array) {
entry.info = EMPTY;
}
currentSize = 0;
for (auto& entry : oldArray) {
if (entry.info == ACTIVE) {
insert(std::move(entry.element));
}
}
};
size_t myhash(const HashedObj& x) const{
static hash<HashedObj> hf;
return hf(x) % array.size();
};
};
#endif