【问题标题】:Linear Search with Jagged Array?使用锯齿状数组进行线性搜索?
【发布时间】:2010-03-11 15:53:43
【问题描述】:

我有以下程序通过数组创建 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*/

【问题讨论】:

  • 在阅读本文时,我不得不在脑海中对自己重复“T 不是类型参数”! :)
  • 想我可能需要对此进行一些澄清。您是说您有一个预先填充了 100 个值的数组,而您的例程需要生成一个尚未在 100 个集合中的新值?或者你是说你想用 100 个唯一值填充和清空(零初始化)数组?
  • 不,我的问题不完全是关于生成数字本身!我想知道是否可以为此使用锯齿状数组,因为线性搜索一直遍历整个数组?

标签: c# jagged-arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不确定这是否是您要查找的内容,但这里有一段 sn-p 代码,它用一个范围内的一组唯一随机数填充数组。正如 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);
            }
        }
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:
      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 的建议。哈希集是要走的路。

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 2011-12-09
        • 1970-01-01
        • 2015-11-13
        • 2020-04-02
        • 1970-01-01
        相关资源
        最近更新 更多