示例#1
0
        static void Main(string[] args)
        {
            var UF = new WeightedQuickUnionPathCompressionUF(10);

            // 见中文版 P146 或英文版 P229 中加权 quick-union 的最坏输入。
            UF.Union(0, 1);
            UF.Union(2, 3);
            UF.Union(4, 5);
            UF.Union(6, 7);
            UF.Union(0, 2);
            UF.Union(4, 6);
            UF.Union(0, 4);

            int[] id = UF.GetParent();
            for (int i = 0; i < id.Length; i++)
            {
                Console.Write(id[i]);
            }
            Console.WriteLine();
        }
示例#2
0
        static void Main(string[] args)
        {
            var n = 10000;

            for (var t = 0; t < 5; t++)
            {
                var input = ErdosRenyi.Generate(n);
                var weightedQuickUnionUF = new WeightedQuickUnionUF(n);
                var weightedQuickUnionPathCompressionUF = new WeightedQuickUnionPathCompressionUF(n);

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

                var weightedQuickUnionTime = RunTest(weightedQuickUnionUF, input);
                var weightedQuickUnionPathCompressionTime = RunTest(weightedQuickUnionPathCompressionUF, input);

                Console.WriteLine("加权 quick-find 耗时(毫秒):" + weightedQuickUnionTime);
                Console.WriteLine("带路径压缩的加权 quick-union 耗时(毫秒):" + weightedQuickUnionPathCompressionTime);
                Console.WriteLine("比值:" + (double)weightedQuickUnionTime / weightedQuickUnionPathCompressionTime);
                Console.WriteLine();

                n *= 2;
            }
        }
示例#3
0
        public void WeightedQuickUnionPathCompressionTest()
        {
            WeightedQuickUnionPathCompressionUF uf = new WeightedQuickUnionPathCompressionUF(n);

            uf.Union(3, 4);
            int[] expected = { 0, 1, 2, 3, 3, 5, 6, 7, 8, 9 };
            //Console.WriteLine("Merge 3 and 4: ");
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 1);

            //Console.WriteLine("Merge 4 and 9: ");
            expected = new int[] { 0, 1, 2, 3, 3, 5, 6, 7, 8, 3 };
            uf.Union(4, 9);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 2);

            //Console.WriteLine("Merge 8 and 0: ");
            expected = new int[] { 8, 1, 2, 3, 3, 5, 6, 7, 8, 3 };
            uf.Union(8, 0);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 3);

            //Console.WriteLine("Merge 2 and 3: ");
            expected = new int[] { 8, 1, 3, 3, 3, 5, 6, 7, 8, 3 };
            uf.Union(2, 3);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 4);

            //Console.WriteLine("Merge 5 and 6: ");
            expected = new int[] { 8, 1, 3, 3, 3, 5, 5, 7, 8, 3 };
            uf.Union(5, 6);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 5);

            //Console.WriteLine("Merge 5 and 9: ");
            expected = new int[] { 8, 1, 3, 3, 3, 3, 5, 7, 8, 3 };
            uf.Union(5, 9);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 6);

            //Console.WriteLine("Merge 7 and 3: ");
            expected = new int[] { 8, 1, 3, 3, 3, 3, 5, 3, 8, 3 };
            uf.Union(7, 3);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 7);

            //Console.WriteLine("Merge 4 and 8: ");
            expected = new int[] { 8, 1, 3, 3, 3, 3, 5, 3, 3, 3 };
            uf.Union(4, 8);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 8);

            //Console.WriteLine("Merge 6 and 1: ");
            expected = new int[] { 8, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
            uf.Union(6, 1);
            for (int i = 0; i < n; i++)
            {
                //Console.Write(uf.Parent[i] + " ");
                Assert.Equal(uf.Parent[i], expected[i]);
            }
            //Console.WriteLine();
            //Console.WriteLine($"Number of components: {uf.NumComponents}");
            Assert.Equal(uf.NumComponents, n - 9);
        }