【问题标题】:canceling arrays by number of items that I am ready to lose按我准备丢失的项目数取消数组
【发布时间】:2014-12-11 15:26:46
【问题描述】:

我们正在编写 c# 程序,该程序将帮助我们删除一些不必要的数据中继器,并且已经在 Finding overlapping data in arrays 的帮助下找到了一些要删除的中继器。现在我们要检查一下,也许我们可以取消其他学期的一些中继器。问题是:

我们有数字数组

{1, 2, 3, 4, 5, 6, 7, ...}, {4, 5, 10, 100}, {100, 1, 20, 50}

有些数字可以在其他数组中重复,有些数字可以是唯一的并且只属于特定的数组。当我们准备从数组中丢失最多 N 个数字时,我们想删除一些数组。

解释:

  1. {1, 2}

  2. {2、3、4、5}

  3. {2, 7}

我们准备从这些数组中丢失最多 3 个数字,这意味着我们可以删除数组 1,因为我们只会丢失数字“1”,它是唯一的数字。我们也可以删除数组 1 和 3,因为我们会丢失数字“1”、“7”或数组 3,因为我们只会丢失数字“7”并且它少于 3 个数字。

在我们的输出中,我们想要给出可以删除的最大数组数量,条件是我们将丢失少于 N 的条件,其中 N 是我们准备丢失的项目数。

【问题讨论】:

  • 当你说你准备输三个号码时,你的意思是你可以选择任何三个号码吗?你有没有想过你会怎么做?
  • @Jim Mischel 不,我说我准备好输掉最多 3 个号码,无论其中哪个号码。我找不到任何有效的解决方案来解决这些问题。
  • 但是你能找到any解决问题的方法吗?很多时候,即使是低效的解决方案也能帮助您找到更有效的方法。
  • @Jim Mischel 其中一个想法是采用具有最多重叠数的最短数组,然后简单地开始以不同的组合删除它们,并检查每次迭代后删除了多少数字。我们可以大量并行进行。
  • 您是否真的需要所有组合,或者您是否计划在以后应用某些选择标准?如果是后者,那么找到一种首先考虑到这一标准的算法几乎肯定是个好主意。

标签: algorithm graph-algorithm array-algorithms


【解决方案1】:

这个问题等价于Set Cover problem(例如:取 N=0),因此一般情况下有效、精确的解决方案不太可能。然而,在实践中,启发式和近似通常已经足够好了。鉴于您的问题与 Set Cover 的相似性,greedy heuristic 是一个自然的起点。不要在覆盖所有元素时停止,而是在覆盖除 N 个元素之外的所有元素时停止。

【讨论】:

    【解决方案2】:

    您需要首先为每个数组获取一个数字,该数字告诉您有多少数字对于该特定数组是唯一的。
    一个简单的方法是O(n²),因为对于每个元素,您需要检查所有数组是否是唯一的。
    通过对数组进行排序、先排序或使用类似堆的数据结构,您可以更有效地做到这一点。

    之后,您只需要找到一个总和,以便一定数量的数组的数字总和为 N
    这与 subset sum problem 类似,但要简单得多,因为 N > 0 和您的所有数字是> 0
    因此,您只需将这些数字从小到大排序,然后遍历排序后的数组并取与总和 < N 一样长的数字。
    最后,您可以删除与您能够放入N 的数字相对应的每个数组。

    【讨论】:

    • 这个解决方案有一些问题,例如我有很多数组,其中 2 个是 {1, 2}, {2, 3}, ... - 每个数组都有 1 个唯一编号,但如果删除它们将被删除 3 个数字而不是 2 个,因为它们具有仅属于这些数组的公共数字 2。在我们的例子中,最短的数组有 93 个数字。在我们的输出中,我们希望提供可以删除的最大数组数量。
    • @genichm:我不明白。如果您的最短数组包含 93 个数字,那么您不能通过仅丢失 3 个数字来删除 any 数组。假设数组中的所有数字都是唯一的。
    • @Jim Mischel 不,正如我在问题中提到的,并非所有数字都是唯一的。 3 个数字只是示例,可以是 20 个数字,也可以是 10 个或 50 个,取决于输入条件。
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2015-10-22
    • 2023-03-09
    相关资源
    最近更新 更多