Skip to content

Commit 6c55575

Browse files
author
Ahmad Alhour
committed
Fix OpenScatterHashTable, DLinkedList, BellmanFord, and SortedList bugs
- Implement OpenScatterHashTable properly (was all NotImplementedException) - Add linear probing for collision resolution - Add dynamic resizing with load factor management - Add comprehensive test suite - Fix DLinkedList.InsertAfter bug: was using index-1 instead of index+1 - Fix BellmanFord algorithm bugs: - Fix iteration count (V-2 → V-1 iterations) - Fix optimality check to skip unreachable vertices - Fix SortedListTests.Indexer_Set test to match actual setter behavior
1 parent 4568efd commit 6c55575

12 files changed

Lines changed: 863 additions & 193 deletions

Algorithms/Graphs/BellmanFordShortestPaths.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ private bool _bellmanFord(TGraph graph, TVertex source)
7171

7272
// First pass
7373
// Calculate shortest paths and relax all edges.
74-
for (int i = 1; i < graph.VerticesCount - 1; ++i)
74+
// Bellman-Ford requires V-1 iterations to find all shortest paths
75+
for (int i = 0; i < graph.VerticesCount - 1; ++i)
7576
{
7677
foreach (var edge in edges)
7778
{
@@ -183,6 +184,10 @@ private bool _checkOptimalityConditions(TGraph graph, TVertex source)
183184
{
184185
int v = _nodesToIndices[vertex];
185186

187+
// Skip unreachable vertices - they cannot relax any edges
188+
if (_distances[v] == Infinity)
189+
continue;
190+
186191
foreach (var edge in graph.NeighboursMap(vertex))
187192
{
188193
int w = _nodesToIndices[edge.Key];

DataStructures/Dictionaries/CuckooHashTable.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ namespace DataStructures.Dictionaries
2020
public class CuckooHashTable<TKey, TValue> where TKey : IComparable<TKey>
2121
{
2222
/// <summary>
23-
/// THE CUCKOO HASH TABLE ENTERY
23+
/// THE CUCKOO HASH TABLE ENTRY
2424
/// </summary>
25-
private class CHashEntry<TKey, TValue> where TKey : IComparable<TKey>
25+
private class CHashEntry
2626
{
2727
public TKey Key { get; set; }
2828
public TValue Value { get; set; }
@@ -53,7 +53,7 @@ public CHashEntry(TKey key, TValue value, bool isActive)
5353

5454
private int _size { get; set; }
5555
private int _numberOfRehashes { get; set; }
56-
private CHashEntry<TKey, TValue>[] _collection { get; set; }
56+
private CHashEntry[] _collection { get; set; }
5757
private UniversalHashingFamily _universalHashingFamily { get; set; }
5858
private EqualityComparer<TKey> _equalityComparer = EqualityComparer<TKey>.Default;
5959

@@ -70,7 +70,7 @@ public CuckooHashTable()
7070
_size = 0;
7171
_numberOfRehashes = 0;
7272
_randomizer = new Random();
73-
_collection = new CHashEntry<TKey, TValue>[DEFAULT_CAPACITY];
73+
_collection = new CHashEntry[DEFAULT_CAPACITY];
7474
_universalHashingFamily = new UniversalHashingFamily(NUMBER_OF_HASH_FUNCTIONS);
7575
}
7676

@@ -121,7 +121,7 @@ private void _rehash(int newCapacity)
121121

122122
try
123123
{
124-
this._collection = new CHashEntry<TKey, TValue>[newCapacity];
124+
this._collection = new CHashEntry[newCapacity];
125125

126126
// Reset size
127127
_size = 0;
@@ -192,7 +192,7 @@ private int _findPosition(TKey key)
192192
private void _insertHelper(TKey key, TValue value)
193193
{
194194
int COUNT_LIMIT = 100;
195-
var newEntry = new CHashEntry<TKey, TValue>(key, value, isActive: true);
195+
var newEntry = new CHashEntry(key, value, isActive: true);
196196

197197
while (true)
198198
{

DataStructures/Dictionaries/OpenAddressingHashTable.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ public class OpenAddressingHashTable<TKey, TValue> : IDictionary<TKey, TValue> w
1515
/// <summary>
1616
/// Open Addressing Entry
1717
/// </summary>
18-
/// <typeparam name="TKey"></typeparam>
19-
/// <typeparam name="TValue"></typeparam>
20-
private class OAHashEntry<TKey, TValue> where TKey : IComparable<TKey>
18+
private class OAHashEntry
2119
{
2220
public TKey key { get; set; }
2321
public TValue value { get; set; }
@@ -33,7 +31,7 @@ public OAHashEntry(TKey Key, TValue Value, bool occp)
3331
private int _size { get; set; }
3432
private double _loadFactor { get; set; }
3533
private int _inTable { get; set; }
36-
private OAHashEntry<TKey, TValue>[] _table { get; set; }
34+
private OAHashEntry[] _table { get; set; }
3735
private List<TKey> _keys { get; set; }
3836
private List<TValue> _values { get; set; }
3937

@@ -46,31 +44,31 @@ public OpenAddressingHashTable(int size)
4644
_size = size;
4745
_loadFactor = 0.40;
4846
_inTable = 0;
49-
_table = new OAHashEntry<TKey, TValue>[_size];
47+
_table = new OAHashEntry[_size];
5048
_keys = new List<TKey>();
5149
_values = new List<TValue>();
5250

5351
//initialize all values to -1
5452
for (int i = 0; i < _table.Length; i++)
5553
{
5654
//initialize each slot
57-
_table[i] = new OAHashEntry<TKey, TValue>(default(TKey), default(TValue), false);
55+
_table[i] = new OAHashEntry(default(TKey), default(TValue), false);
5856
}
5957
}
6058

6159
//doubles the size of the table
6260
private void _expand()
6361
{
6462
//will hold contents of _table to copy over
65-
OAHashEntry<TKey, TValue>[] temp = new OAHashEntry<TKey, TValue>[_size];
63+
OAHashEntry[] temp = new OAHashEntry[_size];
6664
temp = _table;
6765
//double the size and rehash
6866
_size *= 2;
69-
OAHashEntry<TKey, TValue>[] exp = new OAHashEntry<TKey, TValue>[_size];
67+
OAHashEntry[] exp = new OAHashEntry[_size];
7068
for (int i = 0; i < exp.Length; i++)
7169
{
7270
//initialize each slot
73-
exp[i] = new OAHashEntry<TKey, TValue>(default(TKey), default(TValue), false);
71+
exp[i] = new OAHashEntry(default(TKey), default(TValue), false);
7472
}
7573

7674
_inTable = 0;
@@ -88,14 +86,14 @@ private void _expand()
8886
private void _rehash()
8987
{
9088
//will hold contents of _table to copy over
91-
OAHashEntry<TKey, TValue>[] temp = new OAHashEntry<TKey, TValue>[_size];
89+
OAHashEntry[] temp = new OAHashEntry[_size];
9290
temp = _table;
9391

94-
OAHashEntry<TKey, TValue>[] rehash = new OAHashEntry<TKey, TValue>[_size];
92+
OAHashEntry[] rehash = new OAHashEntry[_size];
9593
for (int i = 0; i < rehash.Length; i++)
9694
{
9795
//initialize each slot
98-
rehash[i] = new OAHashEntry<TKey, TValue>(default(TKey), default(TValue), false);
96+
rehash[i] = new OAHashEntry(default(TKey), default(TValue), false);
9997
}
10098

10199
_inTable = 0;
@@ -183,7 +181,7 @@ public void Add(TKey key, TValue value)
183181

184182
if (_table[index].occupied == false)
185183
{
186-
var newEntry = new OAHashEntry<TKey, TValue>(key, value, true);
184+
var newEntry = new OAHashEntry(key, value, true);
187185
_keys.Add(key);
188186
_values.Add(value);
189187

0 commit comments

Comments
 (0)