【问题标题】:C# - Array2 contains Array1 ignore orderC# - Array2 包含 Array1 忽略顺序
【发布时间】:2014-12-09 17:45:55
【问题描述】:

如果我想编写一段在 Array2 中查找 Array1 的代码,无论顺序如何(记住重复项),我应该在哪里查找? 例如

Array1: { 2,5,6,6,3 }
Array2: { 1,2,3,4,5,6,6 }
will return true


Array1: { 2,5,6,6,3 }
Array2: { 1,2,3,4,5,6 }
will return false

我有点想自己解决它,我只需要指出某个方向。

提前致谢。

【问题讨论】:

  • 我不确定我是否理解你的逻辑。您的第一个示例肯定看起来包含在内,而另一个可能如果您忽略重复项。
  • “牢记重复”到底是什么意思?
  • 固定措辞。意味着如果 Array1 多次包含一个元素,它必须至少找到该元素的次数才能返回 true。编辑:还修复了交换的真/假。我的错。
  • 作为提示:使用Dictionary<int, int> 并存储Array2 的每个数字(使用键)的数量(用作值)。

标签: c# arrays compare


【解决方案1】:

好吧,既然您只需要提示而不是代码,那么一种方法是:

  1. array2 复制到List<int>

  2. Sort it.

  3. 分配一个名为usedbit array 等于列表的大小。这些将是指示排序列表中的特定项目是否已用于匹配的标志。

  4. 对于array1 中的每个项目item

    4.1 Binary searchitem 的排序列表。

    4.2。如果未找到,则返回 false -- array2 不包含 array1

    4.3。如果找到,并且有重复项,二分查找算法将随机返回其中一个重复项的索引。在列表中与item 匹配的部分向后扫描,直到找到used[i] 为假的部分。如果找到,请将used[i] 设置为true,然后继续外循环。如果找不到,请从初始二分搜索索引向前扫描,尝试找到未使用的匹配项。同样,如果找到一个,则将used[index] 设置为true,然后继续循环遍历array1

    4.4 如果没有找到未使用的匹配项,则返回 false -- array2 不包含 array1

  5. array1 中为每个项目找到未使用的匹配项后,返回 true:array1 包含在 array2 中。

这种算法的一个优点是,要检查多个数组是否包含在给定数组中,不需要每次都重新排序数组,只需要重新分配BitArray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2012-06-17
    • 2019-09-03
    • 2016-09-14
    相关资源
    最近更新 更多