【问题标题】:Finding overlapping data in arrays在数组中查找重叠数据
【发布时间】:2015-01-31 04:47:57
【问题描述】:

我们正在编写一个 C# 应用程序来帮助删除不必要的数据重复。只有在它接收到的所有数据都被其他转发器接收到的情况下,才能移除转发器。作为第一步,我们需要做的解释如下:

我有 int 数组的集合,例如

一个。 {1、2、3、4、5}

b. {2、4、6、7}

c。 {1、3、5、8、11、100}

可能有数千个这样的数组。我需要找到可以删除的数组。一个数组只有在它的所有数字都包含在其他数组中的情况下才能被删除。在上面的示例中,可以删除数组 a,因为它的数字 2 和 4 在数组 b 中,而数字 1、3、5 在数组 c强>。

这种操作最好的方法是什么?

【问题讨论】:

  • 你想要最少还是最少的数组?
  • 这个算法是否需要确定性(即无论操作顺序如何都给出相同的结果)?
  • 数据是否总是在1..100范围内的整数?
  • harold - 是的,我们需要的数组数量最少。 M. Page - 是的。 dav_i - 不,它可能是大于 100 的整数,目前最常见的是 6 位整数。
  • @genichm 有一点不同,剩下的最小数组个数是一个比较难的问题(Hitting Set),一些最小数组个数可以通过迭代删除得到。

标签: c# arrays algorithm array-algorithms


【解决方案1】:

不是优化的解决方案,只剩下最少的数组。

为数组成员制作丰度字典。例如:

1 => 2
2 => 2
3 => 2
4 => 2
5 => 2
6 => 1
7 => 1
...

检查每个数组,如果所有成员的丰度大于 1,则删除数组并减少字典中每个数字的计数。

【讨论】:

  • 好主意,但创建该词典可能并不容易 :)
  • @Ali Sepehri.Kh 谢谢 :) 我已经开始实施了。
  • @genichm:祝你好运 :) 我会考虑更好的解决方案。
  • @AliSepehri.Kh 以使其变慢为代价,您可以通过使用一些策略性删除顺序(例如,“具有最高最小丰度的数组优先")
  • @harold:是的,我同意。或者包含丰度为 1 的数字的数组应该在结果中。
【解决方案2】:

获得最少数量的剩余数组(相对于不能删除更多数组的数组子集)是 NP 难的set cover problem。然而,即使有数千个数组,如果您将混合整数程序求解器应用于链接的 Wikipedia 文章中的公式,它也很有可能找到最佳解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多