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();
        }
    }
Esempio n. 2
0
      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));
                  }
              }
          }
      }