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