【问题标题】:Stumped finding an algorithm for this problem re: finding set that does not belong很难找到解决这个问题的算法:找到不属于的集合
【发布时间】:2020-01-03 21:45:43
【问题描述】:

给定一组集合,找出不属于的集合:
示例:[[a,b,c,d], [a,b,f,g], [a,b,h,i], [j,k,l,m]]
输出:[j,k,l,m]

我们可以在上面看到前三个集合有一个公共子集 [a,b] 而最后一个没有。注意:可能存在异常值集确实包含输入组中的元素的情况。在这种情况下,我们必须找到与其他集合最少相同的集合。

我尝试遍历输入列表并为每个字符(在哈希中)保持计数。
在第二遍中,找出哪个集合的总数最小。
在上面的示例中,最后一组的计数总和为 4:
j*1 + k*1 + l*1 + m*1。

我想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • 与语言无关的算法问题有一个尝试,但这篇文章的标题很笼统。你能更新它以更好地反映具体问题吗?谢谢你。另一个问题:这里的每个列表/集合中的项目是什么数据类型?
  • 它是一个二维字符串数组,每个字符串是一个字母。
  • 谢谢。更新问题
  • 那么——其他地方给出的解决方案有什么不满意的地方?

标签: arrays algorithm set


【解决方案1】:

您的描述:

找到与其他集合最少相同的集合

将此作为一般应用程序需要计算每个单独的集合对的相似性;这似乎不是你在算法上描述的。此外,这是一个烦人的 O(n^2) 算法。

我建议以下修改和澄清

找到最不符合整个集合列表平均值的集合。

这更符合您的描述,并且可以通过两个简单的通道完成,O(n*m) 其中您有n 大小的集合m

您概述的方法很好地完成了这项工作:计算所有集合中每个元素的出现次数,O(nm)。然后根据每个集合包含的元素对每个集合进行评分,也是 O(nm)。跟踪哪个元素得分最低。


为了获得额外的“准确性”,您可以对分数进行排序并查找评分中的差距——这会指出多个异常值。


如果您在 Python 中执行此操作,请使用 Counter 类作为您的计数。

【讨论】:

  • (最近一直在研究编辑距离作为一个固定问题 - 最坏的情况 annoying!)
【解决方案2】:

您不应该寻找元素计数的最小总和。它取决于集合的大小。但是,如果从总和中减去集合的大小,则只有当集合与所有其他集合不相交时,它才为 0。另一种选择是查看其元素数量的最大值。如果最大值是一个集合上的一个,那么它们只属于这个集合。
您可以使用许多功能。正如注释所述:

注意:可能存在异常值集确实包含输入组中的元素的情况。在这种情况下,我们必须找到与其他集合最少相同的集合。

之前的功能不是最优的。更好的功能是计算共享元素的数量。如果元素在多个集合中,则将其值设置为 1,如果仅出现一次,则将其值设置为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多