コード例 #1
0
        public void Connect_4_with_3_and_3_with_8_and_9_with_4()
        {
            var uf = new QuickFindUF(10);

            uf.Union(4, 3);
            uf.Union(3, 8);
            uf.Union(9, 4);

            for (int i = 0; i < uf.Length; i++)
            {
                if (i == 3)
                {
                    Assert.Equal(8, uf.Nodes[i]);
                }
                else if (i == 4)
                {
                    Assert.Equal(8, uf.Nodes[i]);
                }
                else if (i == 9)
                {
                    Assert.Equal(8, uf.Nodes[i]);
                }
                else
                {
                    Assert.Equal(i, uf.Nodes[i]);
                }
            }
        }
コード例 #2
0
        static void Compute()
        {
            char[] split      = { '\n', '\r' };
            var    input      = TestCase.Properties.Resources.mediumUF.Split(split, StringSplitOptions.RemoveEmptyEntries);
            var    size       = int.Parse(input[0]);
            var    quickFind  = new QuickFindUF(size);
            var    quickUnion = new QuickUnionUF(size);

            string[] pair;
            int      p, q;
            var      quickFindResult  = new int[size];
            var      quickUnionResult = new int[size];

            for (var i = 1; i < size; i++)
            {
                pair = input[i].Split(' ');
                p    = int.Parse(pair[0]);
                q    = int.Parse(pair[1]);

                quickFind.Union(p, q);
                quickUnion.Union(p, q);
                quickFindResult[i - 1]  = quickFind.ArrayVisitCount;
                quickUnionResult[i - 1] = quickUnion.ArrayVisitCount;

                quickFind.ResetArrayCount();
                quickUnion.ResetArrayCount();
            }

            Draw(quickFindResult);
            Draw(quickUnionResult);
        }
コード例 #3
0
        public void testUnionAndConnected_MultiConnection()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Union(0, 1);
            quickFindUF.Union(2, 1);
            Assert.IsTrue(quickFindUF.Connected(0, 1));
            Assert.IsTrue(quickFindUF.Connected(2, 1));
            Assert.IsTrue(quickFindUF.Connected(2, 0));
            Assert.AreEqual(8, quickFindUF.Count());
            Assert.AreEqual(1, quickFindUF.Find(1));
            Assert.AreEqual(1, quickFindUF.Find(0));
            Assert.AreEqual(1, quickFindUF.Find(2));

            quickFindUF.Union(2, 5);
            Assert.IsTrue(quickFindUF.Connected(0, 1));
            Assert.IsTrue(quickFindUF.Connected(2, 1));
            Assert.IsTrue(quickFindUF.Connected(2, 0));
            Assert.IsTrue(quickFindUF.Connected(5, 0));
            Assert.IsTrue(quickFindUF.Connected(5, 1));
            Assert.IsTrue(quickFindUF.Connected(5, 2));
            Assert.AreEqual(7, quickFindUF.Count());
            Assert.AreEqual(5, quickFindUF.Find(1));
            Assert.AreEqual(5, quickFindUF.Find(0));
            Assert.AreEqual(5, quickFindUF.Find(2));
            Assert.AreEqual(5, quickFindUF.Find(5));
        }
コード例 #4
0
        static void Compute()
        {
            var size               = 200;
            var quickFind          = new QuickFindUF(size);
            var quickUnion         = new QuickUnionUF(size);
            var weightedQuickUnion = new WeightedQuickUnionUF(size);
            var connections        = ErdosRenyi.Generate(size);

            var quickFindResult = new int[size];
            var quickUnionResult = new int[size];
            var weightedQuickUnionResult = new int[size];
            int p, q;

            for (var i = 0; i < size; i++)
            {
                p = connections[i].P;
                q = connections[i].Q;

                quickFind.Union(p, q);
                quickUnion.Union(p, q);
                weightedQuickUnion.Union(p, q);
                quickFindResult[i]          = quickFind.ArrayVisitCount;
                quickUnionResult[i]         = quickUnion.ArrayVisitCount;
                weightedQuickUnionResult[i] = weightedQuickUnion.ArrayParentVisitCount + weightedQuickUnion.ArraySizeVisitCount;

                quickFind.ResetArrayCount();
                quickUnion.ResetArrayCount();
                weightedQuickUnion.ResetArrayCount();
            }

            Draw(quickFindResult, "Quick-Find");
            Draw(quickUnionResult, "Quick-Union");
            Draw(weightedQuickUnionResult, "Weighted Quick-Union");
        }
コード例 #5
0
        public void A_big_test()
        {
            var uf = new QuickFindUF(10);

            uf.Union(4, 3);
            uf.Union(3, 8);
            uf.Union(6, 5);
            uf.Union(9, 4);
            uf.Union(2, 1);
            Assert.True(uf.IsConnected(8, 9));
            Assert.False(uf.IsConnected(5, 0));
            uf.Union(5, 0);
            uf.Union(7, 2);
            uf.Union(6, 1);

            Assert.Equal(1, uf.Nodes[0]);
            Assert.Equal(1, uf.Nodes[1]);
            Assert.Equal(1, uf.Nodes[2]);
            Assert.Equal(8, uf.Nodes[3]);
            Assert.Equal(8, uf.Nodes[4]);
            Assert.Equal(1, uf.Nodes[5]);
            Assert.Equal(1, uf.Nodes[6]);
            Assert.Equal(1, uf.Nodes[7]);
            Assert.Equal(8, uf.Nodes[8]);
            Assert.Equal(8, uf.Nodes[9]);
        }
コード例 #6
0
        public void testFind()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            for (int i = 0; i < 10; i++)
            {
                Assert.AreEqual(i, quickFindUF.Find(i));
            }
        }
コード例 #7
0
        public void testUnionAndConnected_NewConnection()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            Assert.IsFalse(quickFindUF.Connected(0, 1));
            Assert.AreEqual(10, quickFindUF.Count());
            quickFindUF.Union(0, 1);
            Assert.IsTrue(quickFindUF.Connected(0, 1));
            Assert.AreEqual(9, quickFindUF.Count());
            Assert.AreEqual(1, quickFindUF.Find(1));
            Assert.AreEqual(1, quickFindUF.Find(0));
        }
コード例 #8
0
        static void Main(string[] args)
        {
            var qu = new QuickFindUF(10);

            var line = Console.ReadLine();
            foreach (var par in line.Split(' '))
            {
                qu.union(int.Parse(par.Split('-')[0]), int.Parse(par.Split('-')[1]));
            }

            foreach (var _id in qu.id)
            {
                Console.Write(_id);
                Console.Write(" ");
            }

            Console.ReadLine();
        }
コード例 #9
0
    public static void Main()
    {
        QuickFindUF uf = new QuickFindUF(10);

        uf.Union(0, 5);
        Console.WriteLine("Connected(0,5) " + uf.Connected(0, 5));
        Console.WriteLine("Connected(5,6) " + uf.Connected(5, 6));
        uf.Union(5, 6);
        uf.Union(1, 2);
        uf.Union(2, 7);
        uf.Union(3, 4);
        uf.Union(4, 8);
        uf.Union(8, 9);
        Console.WriteLine("Connected(0,7) " + uf.Connected(0, 7));
        Console.WriteLine("Connected(1,2) " + uf.Connected(1, 2));
        Console.WriteLine("Connected(3,4) " + uf.Connected(3, 4));
        Console.WriteLine("Connected(5,9) " + uf.Connected(5, 9));
        Console.WriteLine("Connected(8,9) " + uf.Connected(8, 9));
    }
コード例 #10
0
        public void Connect_4_with_3()
        {
            int from = 4;
            int to   = 3;

            var uf = new QuickFindUF(10);

            uf.Union(from, to);

            for (int i = 0; i < uf.Length; i++)
            {
                if (i == from)
                {
                    Assert.Equal(to, uf.Nodes[i]);
                }
                else
                {
                    Assert.Equal(i, uf.Nodes[i]);
                }
            }
        }
コード例 #11
0
        static void Main(string[] args)
        {
            //Quick-find
            QuickFindUF grid = new QuickFindUF(10);

            grid.Union(2, 3);
            grid.Union(3, 6);
            grid.Union(6, 5);
            Console.WriteLine($"Does 2 and 5 connect? {grid.Connected(2, 5)}");
            Console.WriteLine($"Does 6 and 1 connect? {grid.Connected(1, 6)}");

            //Quick-union
            QuickUnionUF quuf = new QuickUnionUF(10);

            quuf.Union(2, 3);
            quuf.Union(3, 6);
            quuf.Union(6, 5);
            Console.WriteLine($"Does 2 and 5 connect? {quuf.Connected(2, 5)}");
            Console.WriteLine($"Does 6 and 1 connect? {quuf.Connected(1, 6)}");

            Console.WriteLine(GreatestCommonDenominator.GetGCD(9, 0));
        }
コード例 #12
0
        static void Main(string[] args)
        {
            var input     = "9-0 3-4 5-8 7-2 2-1 5-7 0-3 4-2".Split(' ');
            var quickFind = new QuickFindUF(10);

            foreach (var s in input)
            {
                quickFind.ResetArrayCount();

                var numbers = s.Split('-');
                var p       = int.Parse(numbers[0]);
                var q       = int.Parse(numbers[1]);

                var id = quickFind.GetParent();
                quickFind.Union(p, q);
                foreach (var root in id)
                {
                    Console.Write(root + " ");
                }
                Console.WriteLine("数组访问:" + quickFind.ArrayVisitCount);
            }
        }
コード例 #13
0
        static void Main(string[] args)
        {
            var n = 2000;

            for (var t = 0; t < 5; t++)
            {
                var input      = ErdosRenyi.Generate(n);
                var quickFind  = new QuickFindUF(n);
                var quickUnion = new QuickUnionUF(n);

                Console.WriteLine("N:" + n);

                var quickFindTime  = RunTest(quickFind, input);
                var quickUnionTime = RunTest(quickUnion, input);

                Console.WriteLine("quick-find 耗时(毫秒):" + quickFindTime);
                Console.WriteLine("quick-union 耗时(毫秒):" + quickUnionTime);
                Console.WriteLine("比值:" + (double)quickFindTime / quickUnionTime);
                Console.WriteLine();

                n *= 2;
            }
        }
コード例 #14
0
        static void Main(string[] args)
        {
            char[]   split = { '\n', '\r' };
            string[] input = TestCase.Properties.Resources.mediumUF.Split(split, StringSplitOptions.RemoveEmptyEntries);
            int      size  = int.Parse(input[0]);

            QuickFindUF         quickFind         = new QuickFindUF(size);
            WeightedQuickFindUF weightedQuickFind = new WeightedQuickFindUF(size);

            int p, q;

            string[] pair;
            for (int i = 1; i < size; i++)
            {
                pair = input[i].Split(' ');
                p    = int.Parse(pair[0]);
                q    = int.Parse(pair[1]);
                quickFind.Union(p, q);
                weightedQuickFind.Union(p, q);
            }

            Console.WriteLine("quick-find: " + quickFind.ArrayVisitCount);
            Console.WriteLine("weighted quick-find: " + weightedQuickFind.ArrayVisitCount);
        }
コード例 #15
0
ファイル: quick-find-uf.cs プロジェクト: bojanskr/algorithms
    public static void Main(String[] args)
    {
        int         n  = Convert.ToInt32(Console.ReadLine());
        QuickFindUF uf = new QuickFindUF(n);
        string      line;

        while ((line = Console.ReadLine()) != null && line != "")
        {
            string[] a_temp = line.Split(' ');
            int[]    array  = Array.ConvertAll(a_temp, Int32.Parse);
            int      p      = array[0];
            int      q      = array[1];

            if (uf.Connected(p, q))
            {
                continue;
            }
            uf.Union(p, q);

            Console.WriteLine(p + " " + q);
        }
        Console.WriteLine(uf.Count() + " components");
        Console.ReadLine();
    }
コード例 #16
0
        public void QuickFindTest()
        {
            var UF = new QuickFindUF(Algorithms.DynamicConnectivity.length);

            Run(UF, Algorithms.DynamicConnectivity.commands);
        }
コード例 #17
0
        public void testConnected_ParameterValidation_PLargerThanN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Connected(11, 4);
        }
コード例 #18
0
        public void testConnected_ParameterValidation_QLessThan0()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Connected(4, -1);
        }
コード例 #19
0
        public void testUnion_ParameterValidation_QLargerThanN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Union(4, 11);
        }
コード例 #20
0
        public void testConnected_ParameterValidation_PEqualN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Connected(10, 4);
        }
コード例 #21
0
        public void testUnion_ParameterValidation_QLessThan0()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Union(4, -1);
        }
コード例 #22
0
        public void testUnion_ParameterValidation_QEqualN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Union(4, 10);
        }
コード例 #23
0
        static void Main(string[] args)
        {
            var n = 40;
            var t = 4;

            // quick-find
            Console.WriteLine("Quick-Find");
            long last = 0;
            long now  = 0;

            for (var i = 0; i < t; i++, n *= 2)
            {
                Console.WriteLine("N:" + n * n);
                var connections = RandomGrid.GetConnections(n);

                var quickFind = new QuickFindUF(n * n);
                now = RunTest(quickFind, connections);
                if (last == 0)
                {
                    Console.WriteLine("平均用时(毫秒):" + now);
                    last = now;
                }
                else
                {
                    Console.WriteLine("平均用时(毫秒):" + now + "\t比值:" + (double)now / last);
                    last = now;
                }
            }

            // quick-union
            Console.WriteLine("Quick-Union");
            n = 40;
            for (var i = 0; i < t; i++, n *= 2)
            {
                Console.WriteLine("N:" + n * n);
                var connections = RandomGrid.GetConnections(n);

                var quickFind = new QuickUnionUF(n * n);
                now = RunTest(quickFind, connections);
                if (last == 0)
                {
                    Console.WriteLine("平均用时(毫秒):" + now);
                    last = now;
                }
                else
                {
                    Console.WriteLine("平均用时(毫秒):" + now + "\t比值:" + (double)now / last);
                    last = now;
                }
            }

            // 加权 quick-union
            Console.WriteLine("Weighted Quick-Union");
            n = 40;
            for (var i = 0; i < t; i++, n *= 2)
            {
                Console.WriteLine("N:" + n * n);
                var connections = RandomGrid.GetConnections(n);

                var quickFind = new WeightedQuickUnionUF(n * n);
                now = RunTest(quickFind, connections);
                if (last == 0)
                {
                    Console.WriteLine("平均用时(毫秒):" + now);
                    last = now;
                }
                else
                {
                    Console.WriteLine("平均用时(毫秒):" + now + "\t比值:" + (double)now / last);
                    last = now;
                }
            }
        }
コード例 #24
0
        public void TestInit()
        {
            var qf = new QuickFindUF(10);

            Assert.AreEqual(10, qf.Count());
        }
コード例 #25
0
        static void Main(string[] args)
        {
            long lastTimeQuickFind          = 0;
            long lastTimeQuickUnion         = 0;
            long lastTimeWeightedQuickUnion = 0;

            long nowTime = 0;

            for (int n = 2000; n < 100000; n *= 2)
            {
                Console.WriteLine("N:" + n);
                QuickFindUF          quickFindUF          = new QuickFindUF(n);
                QuickUnionUF         quickUnionUF         = new QuickUnionUF(n);
                WeightedQuickUnionUF weightedQuickUnionUF = new WeightedQuickUnionUF(n);

                // quick-find
                Console.WriteLine("quick-find");
                nowTime = RunTest(quickFindUF);
                if (lastTimeQuickFind == 0)
                {
                    Console.WriteLine("用时:" + nowTime);
                    lastTimeQuickFind = nowTime;
                }
                else
                {
                    Console.WriteLine("用时:" + nowTime +
                                      " 比值:" + (double)nowTime / lastTimeQuickFind);
                    lastTimeQuickFind = nowTime;
                }
                Console.WriteLine();

                // quick-union
                Console.WriteLine("quick-union");
                nowTime = RunTest(quickUnionUF);
                if (lastTimeQuickUnion == 0)
                {
                    Console.WriteLine("用时:" + nowTime);
                    lastTimeQuickUnion = nowTime;
                }
                else
                {
                    Console.WriteLine("用时:" + nowTime +
                                      " 比值:" + (double)nowTime / lastTimeQuickUnion);
                    lastTimeQuickUnion = nowTime;
                }
                Console.WriteLine();

                // weighted-quick-union
                Console.WriteLine("weighted-quick-union");
                nowTime = RunTest(weightedQuickUnionUF);
                if (lastTimeWeightedQuickUnion == 0)
                {
                    Console.WriteLine("用时:" + nowTime);
                    lastTimeWeightedQuickUnion = nowTime;
                }
                else
                {
                    Console.WriteLine("用时:" + nowTime +
                                      " 比值:" + (double)nowTime / lastTimeWeightedQuickUnion);
                    lastTimeWeightedQuickUnion = nowTime;
                }
                Console.WriteLine();

                Console.WriteLine();
            }
        }
コード例 #26
0
        public void testFind_ParameterValidation_PLargerThanN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Find(11);
        }
コード例 #27
0
        public void testFind_ParameterValidation_PEqualN()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Find(10);
        }
コード例 #28
0
        public void testFind_ParameterValidation_PLessThan0()
        {
            QuickFindUF quickFindUF = new QuickFindUF(10);

            quickFindUF.Find(-1);
        }
コード例 #29
0
 static void Main(string[] args)
 {
     // 查看 UnionFound 类库里面的相关类即可。
     QuickFindUF  quickFindUF  = new QuickFindUF(100);
     QuickUnionUF quickUnionUF = new QuickUnionUF(100);
 }