Skip to content

Commit d36e9e9

Browse files
committed
ienumerable for sets
1 parent febcfff commit d36e9e9

File tree

4 files changed

+86
-21
lines changed

4 files changed

+86
-21
lines changed

Advanced.Algorithms.Tests/DataStructures/Set/DisJointSet_Tests.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Advanced.Algorithms.DataStructures;
22
using Microsoft.VisualStudio.TestTools.UnitTesting;
3-
3+
using System.Linq;
44

55
namespace Advanced.Algorithms.Tests.DataStructures
66
{
@@ -16,7 +16,10 @@ public void Smoke_Test_DisJointSet()
1616
{
1717
disjointSet.MakeSet(i);
1818
}
19-
19+
20+
//IEnumerable test
21+
Assert.AreEqual(disjointSet.Count, disjointSet.Count());
22+
2023
disjointSet.Union(1, 2);
2124
Assert.AreEqual(1, disjointSet.FindSet(2));
2225

@@ -36,6 +39,9 @@ public void Smoke_Test_DisJointSet()
3639
disjointSet.Union(3, 4);
3740
Assert.AreEqual(1, disjointSet.FindSet(4));
3841

42+
//IEnumerable test
43+
Assert.AreEqual(disjointSet.Count, disjointSet.Count());
44+
3945
}
4046
}
4147
}

Advanced.Algorithms.Tests/DataStructures/Set/SparseSet_Tests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@ public void SparseSet_Smoke_Test()
1717
set.Add(15);
1818
set.Add(0);
1919

20+
//IEnumerable test
21+
Assert.AreEqual(set.Count, set.Count());
22+
2023
set.Remove(15);
2124

2225
Assert.IsTrue(set.HasItem(6));
23-
Assert.AreEqual(2, set.Length);
26+
Assert.AreEqual(2, set.Count);
27+
28+
//IEnumerable test
29+
Assert.AreEqual(set.Count, set.Count());
2430
}
2531

2632
[TestMethod]
@@ -38,6 +44,9 @@ public void SparseSet_Stress_Test()
3844
set.Add(element);
3945
}
4046

47+
//IEnumerable test
48+
Assert.AreEqual(set.Count, set.Count());
49+
4150
foreach (var element in testCollection)
4251
{
4352
Assert.IsTrue(set.HasItem(element));
@@ -49,6 +58,9 @@ public void SparseSet_Stress_Test()
4958
set.Remove(element);
5059
Assert.IsFalse(set.HasItem(element));
5160
}
61+
62+
//IEnumerable test
63+
Assert.AreEqual(set.Count, set.Count());
5264
}
5365
}
5466
}

Advanced.Algorithms/DataStructures/Set/DisJointSet.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
4+
using System.Linq;
35

46
namespace Advanced.Algorithms.DataStructures
57
{
68
/// <summary>
79
/// A disjoint set implementation.
810
/// </summary>
9-
/// <typeparam name="T"></typeparam>
10-
public class DisJointSet<T>
11+
public class DisJointSet<T> : IEnumerable<T>
1112
{
1213
/// <summary>
1314
/// A Map for faster access for members.
1415
/// </summary>
1516
private Dictionary<T, DisJointSetNode<T>> set
1617
= new Dictionary<T, DisJointSetNode<T>>();
1718

19+
public int Count { get; private set; }
20+
1821
/// <summary>
1922
/// Creates a new set with given member.
23+
/// Time complexity: log(n).
2024
/// </summary>
2125
public void MakeSet(T member)
2226
{
27+
if (set.ContainsKey(member))
28+
{
29+
throw new Exception("A set with given member already exists.");
30+
}
31+
2332
var newSet = new DisJointSetNode<T>()
2433
{
2534
Data = member,
@@ -28,13 +37,15 @@ public void MakeSet(T member)
2837

2938
//Root's Parent is Root itself
3039
newSet.Parent = newSet;
31-
3240
set.Add(member, newSet);
41+
42+
Count++;
3343
}
3444

3545

3646
/// <summary>
3747
/// Returns the reference member of the set where this member is part of.
48+
/// Time complexity: log(n).
3849
/// </summary>
3950
public T FindSet(T member)
4051
{
@@ -48,9 +59,9 @@ public T FindSet(T member)
4859

4960
/// <summary>
5061
/// Recursively move up in the set tree till root
51-
/// And returns the Root (reference member)
52-
/// Do Path Compression on all visited members on way to root
53-
/// By pointing their parent to Root
62+
/// and return the Root.
63+
/// Does path Compression on all visited members on way to root
64+
/// by pointing their parent to Root.
5465
/// </summary>
5566
private DisJointSetNode<T> FindSet(DisJointSetNode<T> node)
5667
{
@@ -68,8 +79,9 @@ private DisJointSetNode<T> FindSet(DisJointSetNode<T> node)
6879
}
6980

7081
/// <summary>
71-
/// Union's their sets if given members are in differant sets.
72-
/// Otherwise do nothing.
82+
/// Union's given member's sets if given members are in differant sets.
83+
/// Otherwise does nothing.
84+
/// Time complexity: log(n).
7385
/// </summary>
7486
public void Union(T memberA, T memberB)
7587
{
@@ -104,6 +116,17 @@ public void Union(T memberA, T memberB)
104116
}
105117
}
106118
}
119+
120+
IEnumerator IEnumerable.GetEnumerator()
121+
{
122+
return GetEnumerator();
123+
}
124+
125+
public IEnumerator<T> GetEnumerator()
126+
{
127+
return set.Values.Select(x => x.Data).GetEnumerator();
128+
}
129+
107130
}
108131

109132
internal class DisJointSetNode<T>

Advanced.Algorithms/DataStructures/Set/SparseSet.cs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
24
using System.Linq;
35

46
namespace Advanced.Algorithms.DataStructures
57
{
68
/// <summary>
79
/// A sparse set implementation.
810
/// </summary>
9-
public class SparseSet
11+
public class SparseSet : IEnumerable<int>
1012
{
1113
private readonly int[] sparse;
1214
private readonly int[] dense;
1315

14-
public int Length { get; private set; }
16+
public int Count { get; private set; }
1517

1618
public SparseSet(int maxVal, int capacity)
1719
{
1820
sparse = Enumerable.Repeat(-1, maxVal + 1).ToArray();
1921
dense = Enumerable.Repeat(-1, capacity).ToArray();
2022
}
2123

24+
/// <summary>
25+
/// Time complexity: O(1).
26+
/// </summary>
2227
public void Add(int value)
2328
{
2429
if (value < 0)
@@ -31,16 +36,19 @@ public void Add(int value)
3136
throw new Exception("Item is greater than max value.");
3237
}
3338

34-
if (Length >= dense.Length)
39+
if (Count >= dense.Length)
3540
{
3641
throw new Exception("Set reached its capacity.");
3742
}
3843

39-
sparse[value] = Length;
40-
dense[Length] = value;
41-
Length++;
44+
sparse[value] = Count;
45+
dense[Count] = value;
46+
Count++;
4247
}
4348

49+
/// <summary>
50+
/// Time complexity: O(1).
51+
/// </summary>
4452
public void Remove(int value)
4553
{
4654
if (value < 0)
@@ -63,25 +71,41 @@ public void Remove(int value)
6371
sparse[value] = -1;
6472

6573
//replace index with last value of dense
66-
var lastVal = dense[Length - 1];
74+
var lastVal = dense[Count - 1];
6775
dense[index] = lastVal;
68-
dense[Length - 1] = -1;
76+
dense[Count - 1] = -1;
6977

7078
//update sparse for lastVal
7179
sparse[lastVal] = index;
7280

73-
Length--;
81+
Count--;
7482
}
7583

84+
/// <summary>
85+
/// Time complexity: O(1).
86+
/// </summary>
7687
public bool HasItem(int value)
7788
{
7889
var index = sparse[value];
7990
return index != -1 && dense[index] == value;
8091
}
8192

93+
/// <summary>
94+
/// Time complexity: O(1).
95+
/// </summary>
8296
public void Clear()
8397
{
84-
Length = 0;
98+
Count = 0;
99+
}
100+
101+
IEnumerator IEnumerable.GetEnumerator()
102+
{
103+
return GetEnumerator();
104+
}
105+
106+
public IEnumerator<int> GetEnumerator()
107+
{
108+
return dense.Take(Count).GetEnumerator();
85109
}
86110
}
87111
}

0 commit comments

Comments
 (0)