【问题标题】:Concise solution for number of sets contained within包含的集合数量的简明解决方案
【发布时间】:2011-01-13 23:02:14
【问题描述】:

假设我有一个简短的字符串列表,其中可以包含重复项:

然后假设我有一些其他字符串列表,它们可能是也可能不是原始列表的子集。我需要知道:

  1. 第二组是否“覆盖”了第一组(例如,第一组中的每个项目是否也包含在第二组中)?
  2. 如果 1 为真,那么重新创建第一个集合需要多少个第二个集合的实例?

所以,在这种情况下,如果我的第二组是列表:,我会得到 TRUE 和 2。

如果是列表:,我会得到 FALSE。

如果我的第一个是:

  • 第二个是:返回 TRUE 和 4。
  • 第二个是 :返回 TRUE 和 3。

我知道这可以使用嵌套循环在 N x M 时间内轻松完成。但我正在寻找一种简洁和/或优化的(最好是基于 Linq 的)解决方案。我玩过 Linq.Except,但问题是它只返回不同的元素,因此在比较包含重复项的字符串列表时没有用。

有人有什么独特的想法吗?

【问题讨论】:

  • 像往常一样...有什么限制?你说你有一个字符串列表,但在你的例子中你给出了字符(这可能会产生误导)。那么这些是唯一字符还是这些字符串?列表可以有多大?假设您有“其他一些字符串列表”...说,还有多少其他的?多大?您是否想要一个不考虑您正在使用的机器(您的计算机)的物理限制的理论解决方案?
  • 第一个是简单的Intersect 两组。并询问相交是否等于您的第一个列表的一组(所以没有重复)。
  • @Syntax,它们是字符串。为了简洁起见,我只是在示例中使用了字符。列表很短,通常不超过 10 个。其他列表的数量各不相同,但也少于 10 个。不需要理论解决方案,只是想知道是否有人有一个聪明和/或简洁的代码 sn-p 可以解决这个问题.

标签: c# algorithm performance pattern-matching


【解决方案1】:

第二组是否“覆盖”了第一组(例如,第一组中的每个项目是否也包含在第二组中)?

// Assuming that the elements are comparable (strings are);
// if not, need to implement your own IComparer<T>
var doesCover = !original.Except(secondList).Any();

重新创建第一个集合需要多少第二个集合的实例?

var instancesRequired = secondList.GroupBy(e => e)
    .Max(gr => (original.Count(e => e.Equals(gr.Key))
               + gr.Count() - 1) / gr.Count());

警告:如果originalsecondList 都为空,则doesCover 将为真,但instancesRequired 的计算将引发异常。因此可能需要专门检查空列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2010-09-05
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多