使用锯齿状数组进行线性搜索?

时间:2010-03-11 15:53:44

标签: c# jagged-arrays

我有以下程序通过数组创建100个随机元素。 那100个随机值是唯一的,每个值只显示一次。

尽管使用线性搜索,它仍然会查找整个数组。 我怎样才能将 Jagged Array 加入其中,所以它只会“扫描”剩余的剩余位置? (假设我将表格保持在100个最大元素,因此,如果生成一个随机值,则该数组将保留99个元素,并使用线性搜索扫描并且... ...

我假设我必须在FoundLinearInArray的某个地方实现锯齿状数组?

希望这有任何意义。 问候。

 private int ValidNumber(int[] T, int X, int Range)
    {
        Random RndInt = new Random();
        do
        {
            X = RndInt.Next(1, Range + 1);
        } while (FoundLinearInArray(T, X));

        return X; 

    }/*ValidNumber*/

    private bool FoundLinearInArray(int[] A, int X)
    {
        byte I = 0;
        while ((I < A.Length) && (A[I] != X))
        {
            I++;
        }
        return (I < A.Length);
    }/*FoundInArray*/


    public void FillArray(int[] T, int Range)
    {
        for (byte I = 0; I < T.Length; I++)
        {
            T[I] = ValidNumber(T, I, Range);
        }

    }/*FillArray*/

3 个答案:

答案 0 :(得分:1)

所以看起来你想要填充你的数组,并且你想保证它中的每个项目都是唯一的?如果是这样,请将生成的每个数字放入Hashset。关于hashset的查找是O(1),(或者可能是对数) - 你可以将一百万个项目放入其中,并且仍然具有极高性能的查找。

答案 1 :(得分:0)

我不确定这是否是您正在寻找的,但这里有一段代码,用一组范围内的一组唯一随机数填充数组。正如JMarsch建议的那样,它使用HashSet来跟踪所使用的数字。

它还会快速检查以确定问题是可解决的 - 如果Range小于数组的大小,那么您将没有足够的唯一数字来填充数组。

最后,它创建一次随机数生成器而不是多次,这样可以更好地分配数字。由于数字必须是唯一的,在这种情况下你永远不会注意到,但我认为这是一种习惯的好习惯。

    private int GenerateUniqueRandomNumber(Random chaos, HashSet<int> used, int range)
    {
        while (true)
        {
            int candidate = chaos.Next(range);
            if (!used.Contains(candidate))
            {
                used.Add(candidate);
                return candidate;
            }
        }
    }



    public void FillArray(int[] array, int range)
    {
        if (range < array.Length)
        {
            throw new ArgumentException("Range is too small");
        }

        Random chaos = new Random();
        HashSet<int> used = new HashSet<int>();

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = GenerateUniqueRandomNumber(chaos, used, range);
        }
    }

我希望这会有所帮助。

答案 2 :(得分:0)

static int[] FillArray(int low, int high, int count)
    {
        Random rand = new Random();
        HashSet<int> Data = new HashSet<int>();
        while (Data.Count() < count)
            Data.Add(rand.Next(low, high));
        return Data.ToArray();
    }

这与JMarsch的建议类似。 Hashsets是要走的路。