-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOpenAddressingHashTable.cs
More file actions
135 lines (129 loc) · 3.66 KB
/
Copy pathOpenAddressingHashTable.cs
File metadata and controls
135 lines (129 loc) · 3.66 KB
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
using System.Diagnostics.CodeAnalysis;
public class OpenAddressingHashTable
{
public class KeyValue
{
public string Key;
public string Value;
public KeyValue(string key, string value)
{
Key = key;
Value = value;
}
}
private int _collisionsCount = 0;
private int _indexCount;
private List<KeyValue> _list;
private int _keysValuesCount;
public OpenAddressingHashTable(int indexCount)
{
_indexCount = indexCount;
_keysValuesCount = 0;
_list = new List<KeyValue?>();
for (int i = 0; i < _indexCount; i++)
{
_list.Add(null);
}
}
public int HashFunction(string key)
{
int hashCode = key.GetHashCode();
hashCode %= _indexCount;
if (hashCode < 0)
hashCode += _indexCount;
return hashCode;
}
public void AddKeyValue(string key, string value)
{
int index = HashFunction(key);
int counter = 0;
while (_list.ElementAt(index) != null)
{
index = (++index % _indexCount);
if (counter != 0)
{
_collisionsCount++;
}
counter++;
}
_list.Insert(index, new KeyValue(key, value));
_keysValuesCount++;
if (_indexCount * 0.75 < _keysValuesCount)
{
IncreaseList(_indexCount * 10);
}
}
public KeyValue LookForKeyValue(string key)
{
int index = HashFunction(key);
int counter = 0;
while(true)
{
index = (++index) % _indexCount;
counter++;
if (_list.ElementAt(index) != null && _list.ElementAt(index).Key == key)
{
return _list.ElementAt(index);
}
if (counter > _indexCount)
{
KeyValue kv = new KeyValue(string.Empty, string.Empty);
return kv;
}
}
}
public void DeleteKeyValue(string key)
{
int index = HashFunction(key);
int counter = 0;
while(true)
{
index = ++index % _indexCount;
counter++;
if (_list.ElementAt(index) != null && _list.ElementAt(index).Key == key)
{
_keysValuesCount--;
_list.RemoveAt(index);
return;
}
if (counter > _indexCount)
{
return;
}
}
}
public void WriteList()
{
for (int i = 0; i < _list.Count; i++)
{
Console.Write("{0}: ", i);
KeyValue kv = _list.ElementAt(i);
if (kv != null)
{
Console.Write($"{kv.Key}:{kv.Value} ");
}
Console.WriteLine();
}
Console.WriteLine($"Total count of collisions: {_collisionsCount}");
}
public void IncreaseList(int indexCount)
{
List<KeyValue> temp = new List<KeyValue>();
for (var i = 0; i < _list.Count; i++)
{
var keyValue = _list[i];
if (keyValue != null)
temp.Add(keyValue);
}
_indexCount = indexCount;
_keysValuesCount = 0;
_list = new List<KeyValue>();
for (int i = 0; i < _indexCount; i++)
_list.Add(null);
for (var i = 0; i < temp.Count; i++)
{
var keyValue = temp[i];
AddKeyValue(keyValue.Key, keyValue.Value);
}
}
}