Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不是';线性搜索比二进制搜索花费更多的时间?_C# - Fatal编程技术网

C# 为什么不是';线性搜索比二进制搜索花费更多的时间?

C# 为什么不是';线性搜索比二进制搜索花费更多的时间?,c#,C#,当我运行我的程序时,我加载一个带有随机数的整数列表,我尝试的最大值是500000个数字(加载需要几分钟),然后我用listName.sort()对列表进行排序 用户输入一个数字,我有一个“线性搜索”方法,检测列表是否包含该数字,如果是,我在每个列表编号中进行for循环,并尝试查找输入数字(线性/暴力)。然后我以毫秒为单位打印数字输入和搜索结果之间的时间差。但我还有另一种二进制搜索的方法,它做同样的事情,但它不使用暴力,而是进行二进制搜索 我一次尝试了两次搜索,希望二进制搜索速度快得多,但结果都需

当我运行我的程序时,我加载一个带有随机数的整数列表,我尝试的最大值是500000个数字(加载需要几分钟),然后我用
listName.sort()对列表进行排序

用户输入一个数字,我有一个“线性搜索”方法,检测列表是否包含该数字,如果是,我在每个列表编号中进行for循环,并尝试查找输入数字(线性/暴力)。然后我以毫秒为单位打印数字输入和搜索结果之间的时间差。但我还有另一种二进制搜索的方法,它做同样的事情,但它不使用暴力,而是进行二进制搜索

我一次尝试了两次搜索,希望二进制搜索速度快得多,但结果都需要1或2毫秒。。花这么少时间,我做错了什么

static void Main(string[] args)
{
    List<int> arr = new List<int>();
    Random rnd = new Random();
    int randomNum;
    DateTime primeira = DateTime.Now;

//here i use 50000 numbers in the array
    for (var i = 0; i < 50000; i++)
    {
        do
        {
            //150000 options that don't repeat
            randomNum = rnd.Next(1, 150000);
        } while (arr.Contains(randomNum));
        arr.Add(randomNum);

    }
    arr.Sort();
    DateTime segunda = DateTime.Now;
    TimeSpan span = segunda - primeira;
    int ms = (int)span.TotalMilliseconds;
    Console.WriteLine($"Load time: {ms}");
    //I use this to know a number to search
    Console.WriteLine($"Biggest: {arr[arr.Count - 1]}"); 
    // search(arr);
    searchBrute(arr);  
}

public static void searchBrute(List<int> arr)
{
    Console.WriteLine("Insert a number for searching:");

    var input = Console.ReadLine();
    if (int.TryParse(input, out int number))
    {
        if (!arr.Contains(number))
        {
            Console.WriteLine("The number isn't in the array!");
            searchBrute(arr);
        }
        DateTime now = DateTime.Now;

        for (int i = 0; i < arr.Count; i++)
        {
            if(number == arr[i])
                showFound(number, i);
        }
        DateTime two = DateTime.Now;
        TimeSpan test = two - now;
        int msT = (int)test.TotalMilliseconds;
        Console.WriteLine($"Time taken: {msT}");
    }
}

public static void search(List<int> arr)
{
    bool found;
    int left = 0;
    int right = arr.Count - 1;
    Console.WriteLine("Insert a number for searching:");
    var input = Console.ReadLine();
    DateTime primeira = DateTime.Now;
    DateTime segunda;
    if (int.TryParse(input, out int number))
    {
        if (!arr.Contains(number))
        {
            Console.WriteLine("The number isn't in the array!");
            search(arr);
        }
        do
        {
            found = false;
            int mid = (left + right) / 2;
            if (number == arr[mid])
            {
                found = true;
                showFound(number, mid);

                segunda = DateTime.Now;
                TimeSpan span = segunda - primeira;
                int ms = (int)span.TotalMilliseconds;
                Console.WriteLine($"Time taken: {ms}");
            }
            else
            {
                if (arr[mid] > number)
                    right = mid - 1;
                else
                    left = mid + 1;

            }
        } while (!found);
    }
}
static void Main(字符串[]args)
{
List arr=新列表();
随机rnd=新随机();
int随机数;
DateTime primeira=DateTime.Now;
//这里我在数组中使用50000个数字
对于(变量i=0;i<50000;i++)
{
做
{
//150000个不重复的选项
randomNum=rnd.Next(150000);
}而(arr.Contains(randomNum));
arr.Add(随机数);
}
arr.Sort();
DateTime segunda=DateTime.Now;
时间跨度=segunda-primeira;
int ms=(int)span.total毫秒;
WriteLine($“加载时间:{ms}”);
//我用这个来知道要搜索的号码
WriteLine($“最大:{arr[arr.Count-1]}”);
//搜索(arr);
搜索暴力(arr);
}
公共静态void searchBrute(列表arr)
{
Console.WriteLine(“插入搜索编号:”);
var input=Console.ReadLine();
if(int.TryParse(输入,输出整数))
{
如果(!arr.Contains(number))
{
WriteLine(“该数字不在数组中!”);
搜索暴力(arr);
}
DateTime now=DateTime.now;
对于(int i=0;i编号)
右=中-1;
其他的
左=中+1;
}
}而(!发现);
}
}

所以。正如其他人所说,使用System.Diagnostics.Stopwatch进行计时

这不是二进制搜索速度慢的原因。两种搜索方法都包含以下行:

if (!arr.Contains(number))

这是一个线性搜索。这可能会使二进制搜索看起来慢得不合理,因为它也是O(n),内部带有线性搜索。

怎么了?使用
DateTime
进行基准测试是一个很好的起点(使用
System.Diagnostics.Stopwatch
。然后确保在发布模式下运行基准测试时未启用调试器和优化,在测量时间之前使用jitting方法,当然,还要对多个搜索操作进行基准测试以减少计时不准确。您必须考虑NET和所有LIT引擎盖下的le小部件可以做优化之类的事情。你需要运行多个迭代并扔掉第一个迭代。重新测试并按其他顺序进行也可以。秒表是一种更好的计时方式。不要使用
DateTime
。而是使用
System.Diagnostics.StopWatch
好吧,你必须简化cpu的可以在实际需要之前检测循环和提取现金行。此外,根据不同的搜索算法,代码可能会被优化得非常不同。我也很感兴趣。您是否尝试过优化并没有调试器?在您的二进制搜索中,DateTime primeira=DateTime.Now;位于错误的位置。它应该在它之后ind数组有编号。另外,需要更大的搜索空间。谢谢你的回答。我删除了这些行并添加了秒表,但我可能遗漏了一些内容,因为它只是说需要0毫秒…正如上面有人在评论中所说,“Cpu可以在实际需要之前检测循环并获取捕捉线”,所以我认为这就是它不是真正搜索的原因,,,我如何才能真正进行搜索?这可能不是问题所在。问题是代码在0毫秒内执行。您的测试运行的时间不足以花费整毫秒。抱歉,我怎么做?我应该在搜索中执行循环还是什么?只需运行几次搜索1000次,并将计时放在搜索函数之外。好的,我在搜索之前,在线性for循环或do while二进制搜索循环上,放置了一个1000次迭代的for循环,然后在1000次迭代循环之后,我打印了时间。这确实有效,但两次搜索的时间似乎几乎相同。谢谢你,我学会了今天我吃了很多。