private static void testAgainstNaiveRandomly() { int trials = 1000; int iterations = 3000; int numElems = 300; for (int i = 0; i < trials; i++) { NaiveDisjointSet nds = new NaiveDisjointSet(numElems); DisjointSet ds = new DisjointSet(numElems); for (int j = 0; j < iterations; j++) { int k = rand.Next(numElems); int l = rand.Next(numElems); assert(ds.GetSizeOfSet(k) == nds.GetSizeOfSet(k)); assert(ds.AreInSameSet(k, l) == nds.AreInSameSet(k, l)); if (rand.NextDouble() < 0.1) { assert(ds.MergeSets(k, l) == nds.MergeSets(k, l)); } assert(nds.GetNumberOfSets() == ds.GetNumberOfSets()); if (rand.NextDouble() < 0.001) { ds.CheckStructure(); } } ds.CheckStructure(); } }
public void Union(int size) { var pairs = GenerateRandomPairs(size); IDisjointSet actual = new DisjointSet(size); IDisjointSet expected = new NaiveDisjointSet(size); foreach (var pair in pairs) { expected.Union(pair.Item1, pair.Item2); actual.Union(pair.Item1, pair.Item2); var expectedSets = expected.GetSets(); var actualSets = actual.GetSets(); Assert.Equal(expectedSets.Length, actualSets.Length); foreach (var expectedSet in expectedSets) { var actualSet = actualSets.FirstOrDefault(x => x.Contains(expectedSet[0])); Assert.Equal(expectedSet.Length, actualSet.Length); Assert.True(expectedSet.All(x => actualSet.Contains(x))); } Assert.Equal(expected.SetCount, actual.SetCount); for (int i = 0; i < size; i++) { Assert.Equal(expected.GetSetSize(i), actual.GetSetSize(i)); for (int j = 0; j < size; j++) { Assert.Equal(expected.InSameSet(i, j), actual.InSameSet(i, j)); } } } }