测试判断List中是否有不同项的时间复杂度

功能:当集合中某一项不同于其它项时高亮(为空时不计入)


List长度为522万

1、stringBuilding+replace方法


2、Distinct+Count方法


3、Compare方法


时间 预期结果

全为5220 0.577 0.5   1.51 没有重复项

0.559 0.5   1.362

0.774 0.571 1.398

全为"" 0.09  0.295 0.091 没有重复项

0.083 0.283 0.084

0.086 0.277 0.082

某一个为5220 0.086 0.111 0.087 没有重复项

0.09  0.115 0.093

0.088 0.112 0.088

全部不一样 0.149 1.639 1.033 高亮

0.157 1.503 0.855

0.143 1.458 0.871

某两个不一样 0.092 0.184 0.099 高亮

0.086 0.111 0.085

0.085 0.108 0.082


改为1522万条不一样

时间复杂度:0.418 4.047 3.026

    0.438 4.08  2.959

    0.409 3.937 3.001

空间复杂度:72 268433372 48

    72 268436896 -164

    72 268379204 0



代码:


    <%

        var gaoliang = false;

        List<string> testIntList = new List<string>();

        for (var i = 0; i < 15220000; i++)

        {

            if (i == 5220 || i == 5116)

            {

                testIntList.Add(i.ToString());

            }

            else

            {

                testIntList.Add("");

            }

        }


        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();

        long start = GC.GetTotalMemory(true);

        watch.Start();

        var result = "没有重复项";

        StringBuilder strTest = new StringBuilder();

        String str = string.Empty;

        foreach (var j in testIntList)

        {

            if (j + "" != "")

            {

                if (str + "" == "")

                {

                    str = j;

                }

                if (str.Length != j.Length)

                {

                    gaoliang = true;

                }

                else

                {

                    strTest.Append(j);

                }

            }

        }

        if (strTest.Length > 0)

        {

            strTest = strTest.Replace(str, "");

        }

        

        if (strTest.Length > 0 || gaoliang)

        {

            result = "高亮";

        }

        watch.Stop();

        GC.Collect();

        GC.WaitForFullGCComplete();

        long end = GC.GetTotalMemory(true);

        long useMemory = end - start;

        var useTime1 = (double)watch.ElapsedMilliseconds / 1000;


        start = GC.GetTotalMemory(true);

        watch.Restart();

        var result2 = "没有重复项";

        if (testIntList.Where(x => x + "" != "").Distinct().Count() > 1)

        {

            result2 = "高亮";

        }

        watch.Stop();

        GC.Collect();

        GC.WaitForFullGCComplete();

        end = GC.GetTotalMemory(true);

        long useMemory2 = end - start;

        var useTime2 = (double)watch.ElapsedMilliseconds / 1000;

        start = GC.GetTotalMemory(true);

        watch.Restart();

        //.Write("<script>alert('"+useTime1+"')</script>");

        var result3 = "没有重复项";

        var firStr = "";

        foreach (var item in testIntList)

        {

            if (item + "" != "")

            {

                if (firStr + "" == "")

                {

                    firStr = item.Trim();

                }

                else if (firStr.CompareTo(item.Trim()) != 0)

                {

                    result3 = "高亮";

                }

            }

        }

        watch.Stop();

        GC.Collect();

        GC.WaitForFullGCComplete();

        end = GC.GetTotalMemory(true);

        long useMemory3 = end - start;

        var useTime3 = (double)watch.ElapsedMilliseconds /1000;

        

     %>

     <script type="text/javascript">

         console.log("<%=result %>:<%=useTime1 %>:<%=useMemory %>");

         console.log("<%=result2 %>:<%=useTime2 %>:<%=useMemory2 %>");

         console.log("<%=result3 %>:<%=useTime3 %>:<%=useMemory3 %>");

     </script>