对于我在输出后添加的代码,我得到以下结果:
Initializing
2.4
Searching
Index: 55504605
Time: 0.0374
Index: 21891944
Time: 0.0178
Index: 56663763
Time: 0.0425
Index: 37441319
Time: 0.0261
Index: -1
Time: 0.0676
Index: 9344095
Time: 0.0062
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var sw = new Stopwatch();
int[] big = new int[100000000];
Console.WriteLine("Initializing");
sw.Start();
var r = new Random(0);
for (int i=0; i < big.Length; ++i)
{
big[i] = r.Next(big.Length);
}
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString("s\\.f"));
Console.WriteLine();
Console.WriteLine("Searching");
for (int i=0; i<6; ++i)
{
int searchFor = r.Next(big.Length);
sw.Reset();
sw.Start();
int index = Array.IndexOf(big, searchFor);
sw.Stop();
Console.WriteLine("Index: {0}", index);
Console.WriteLine("Time: {0:s\\.ffff}", sw.Elapsed);
}
Console.Read();
}
}
}
我不明白为什么第5次迭代的索引为-1。代码不是在数组中返回匹配的位置吗?数组编号是否从0到100,000,000?
我不确定我是否可以在这里提出跟进问题。问题是关于在C#命名空间的CLR中实现的数组二进制搜索。根据{{3}}链接,如果未找到该数字,则搜索返回数组元素的索引的补码。它表示如果数字小于一个或两个元素,结果将是第一个元素的索引的比特补码更大。如果该值大于所有元素,则结果将是数组最后一个元素的索引的逐位补码。我想知道结果有什么好处,以及返回这些值的逐位补充背后的逻辑是什么?
以下是我的搜索结果和修改后的代码:
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var sw = new Stopwatch();
int[] big = new int[100000000];
Console.WriteLine("Initializing");
sw.Start();
var r = new Random(0);
for (int i=0; i < big.Length; ++i)
{
big[i] = r.Next(big.Length);
}
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString("s\\.f"));
Console.WriteLine(sw.ElapsedTicks.ToString("s\\.f"));
Console.WriteLine();
Console.WriteLine("Searching");
for (int i=0; i<6; ++i)
{
int searchFor = r.Next(big.Length);
sw.Reset();
sw.Start();
int index = Array.IndexOf(big, searchFor);
sw.Stop();
Console.WriteLine("Index: {0}", index);
Console.WriteLine("Time: {0:s\\.ffff}", sw.Elapsed);
}
Console.WriteLine();
Console.WriteLine("Sorting");
sw.Reset();
sw.Start();
Array.Sort(big);
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString("s\\.f"));
Console.WriteLine();
Console.WriteLine("Searching (binary)");
for (int i=0; i<6; ++i)
{
int searchFor = r.Next() % big.Length;
sw.Reset();
sw.Start();
int index = Array.BinarySearch(big, searchFor);
sw.Stop();
Console.WriteLine("Index: {0}", index);
Console.WriteLine("Time: {0:s\\.fffffff}", sw.Elapsed);
}
Console.ReadLine();
}
}
}
Index: 55504605
Time: 0.0460
Index: 21891944
Time: 0.0147
Index: 56663763
Time: 0.0377
Index: 37441319
Time: 0.0248
Index: -1
Time: 0.0755
Index: 9344095
Time: 0.0068
Sorting
16.5
Searching (binary)
Index: 8990721
Time: 0.0000844
Index: 4404823
Time: 0.0000046
Index: 52683151
Time: 0.0000059
Index: -37241611
Time: 0.0000238
Index: -49384544
Time: 0.0000021
Index: 88243160
Time: 0.0000064
只有几个符合条件的陈述:1-以上代码不是我的。我只是想了解它。 2-如果我错误地使用了任何条款,请在学习过程中告诉我。
答案 0 :(得分:10)
数组编号是否从0到100,000,000?
没有。初始化一个包含100000000个随机数的100000000个项目的数组。
int[] big = new int[100000000];
for (int i=0; i < big.Length; ++i)
{
big[i] = r.Next(big.Length);
}
然后尝试找到六个随机数的索引:
for (int i=0; i<6; ++i)
{
int searchFor = r.Next(big.Length);
int index = Array.IndexOf(big, searchFor);
但是,不能保证big
数组包含0到100000000之间的所有数字。Random.Next()
可以返回重复值,这意味着缺少该范围内的其他数字。
因此,第二个循环中的r.Next(big.Length)
可能会返回一个不在数组中的数字,因此返回值为-1
。
如果您确实要随机播放 0-99999999中的数字,那么请改为generate a list containing those numbers,and shuffle it。