1 Implement a Key-Value pair datastucture such that there is:
2 O(1) insertion void insert(K, V)
3 O(1) fetching
4 O(1) deletion
5 O(1) fetching of Random element
6
7
8
9 Test cases:
10 1. Unit tests to cover all APIs
11 2. We try delete a key not exist,
12 3. Performance test case to verify its O(1)
13 4. Track memory
14 5.
15
16 public class KeyValueStore
17 {
18 private Dictionary<string, int> dict = new Dictionary<string, int>();
19 private Tuple<string, SomeType> [] array = new Tuple<string, SomeType>[1000];
20 private int current = 0;
21
22 public void Insert(string key, SomeType value)
23 {
24 if (!dict.ContainsKey(key))
25 {
26 this.array[current] = new Tuple<string, SomeType>(key, value);
27 dict[key] = current;
28 current++;
29 }
30 else
31 {
32 this.array[dict[key]] = new Tuple<string, SomeType>(key, value);
33 }
34 }
35
36 public SomeType Fetch(string key)
37 {
38 if (!dict.ContainsKey(key))
39 {
40 throw new KeyNotFoundException(key);
41 }
42 else
43 {
44 return this.array[dict[key]].Item2;
45 }
46 }
47
48 public void Delete(string key)
49 {
50 if (dict.ContainsKey(key))
51 {
52 int toRemoveIndex = dict[key];
53 int lastElementIndex = this.current - 1;
54
55 // swap last element with the element to remove
56 this.array[toRemoveIndex] = this.array[lastElementIndex];
57 dict.Remove(key);
58
59 // we need to update the dict for the last element
60 string key = this.array[lastElementIndex].Item1;
61 dict[key] = toRemoveIndex;
62 this.current--;
63 }
64 }
65
66 public SomeType FetchRandom()
67 {
68 if (current == 0)
69 {
70 throw new ValueNotFoundException();
71 }
72 else
73 {
74 int random = Random(0, current);
75 return this.array[random].Item2;
76 }
77 }
78 }