为什么我为C#数组得到-1的索引?

时间:2016-09-06 13:23:16

标签: c#

对于我在输出后添加的代码,我得到以下结果:

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-如果我错误地使用了任何条款,请在学习过程中告诉我。

1 个答案:

答案 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 numbersand shuffle it