【问题标题】:Algorithm determining the smallest coprime subset确定最小互质子集的算法
【发布时间】:2013-10-20 18:30:30
【问题描述】:

给定n个正整数的集合A,确定一个非空子集B 由尽可能少的元素组成,使其 GCD 为 1 并输出其大小。

例如:
5
6 10 12 15 18

产生“3”的输出,而:

5
2 4 6 8 10

等于“NONE”,因为无法确定子集。

所以它看起来很基本,但我仍然坚持它。我对此的想法如下:我们知道集合中已经存在某个数字的倍数是没有用的,因为它们的除数是某个因子 k 的倍数,我们要寻找最小的子集。因此,对于每个 ni,我们从进一步的计算中删除任何 kni,其中 k 是正整数。

不过,这就是我卡住的地方。接下来我该怎么做?如果已经有一些 2-element 子集,然后是 3-elem 等等,我只能想到一种愚蠢的、蛮力的尝试方法。我应该检查什么才能以更聪明的方式确定它?

【问题讨论】:

  • 预期的时间/内存复杂度是多少?
  • 没有,我只是想把最有效的方法作为算法训练的一种形式。
  • 另见此链接。也许它会有所帮助。 cs.stackexchange.com/questions/10249/…
  • 只是对读者的警告 - 看起来“互质子集”的定义与此处最近的问题略有不同。

标签: algorithm


【解决方案1】:

假设对于每个 A,B(两个元素),我们计算它们的最大公约数 除数 D。然后我们将这些 D 值存储为以下形式的映射: A,B -> D 假设我们还存储反向映射 D -> A,B

如果至少有一个 D=1,那么我们就去 - 答案是 2。 现在假设,不存在 D=1 的 D。 答案为 3 需要满足什么条件? 我认为这个: 存在两个 D 值,例如 D1 和 D2,使得 GCD(D1, D2)=1。 对? 所以现在我们将问题转换为 在所有 D 的集合上存在相同的问题,我们已经改变了选项 a 选项的 2 答案 a 3 答案。对吧?

我不是 100% 肯定只是大声思考。

但是这个转换后的问题更糟,因为 我们必须存储更多的值。 (N 个元素的组合第 2 类)。

不确定,您提出的这个问题似乎很难 我的问题。如果存在,我会感到惊讶 比蛮力更好的方法 并且很想知道。

您需要考虑(并寻找)的是: 有没有办法表达 GCD(a1, a2, ... aN) 如果您知道他们的成对 GCD。如果有一些 某种方法或公式,你可以简化一点 您的搜索(用于匹配的最小子集 所需的标准)。

另请参阅此链接。也许它会有所帮助。

https://cs.stackexchange.com/questions/10249/finding-the-size-of-the-smallest-subset-with-gcd-1

【讨论】:

    【解决方案2】:

    这个问题绝对是一个很难解决的问题。我看不到任何计算效率高的算法可以保证在合理的时间内找到解决方案。

    一种方法是: 形成一个有序集合列表,其中包含原始集合中每个元素的素因子。

    现在您需要找到它们的交集为零的最小集合数。

    为此,首先在列表中对这些集合进行排序,以便与其他集合的交集数量最少的集合朝向开始。现在什么是“最少的交叉点”?

    这就是启发式方法发挥作用的地方。可以是:
    1. 设置与其他元素的交点数少于 MIN。
    2. 设置与其他元素的交集数少于 MAX。
    3.任何其他更合适的定义。

    现在您可能需要通过递归来昂贵地迭代所有组合以确定解决方案。

    【讨论】:

    • 只是为了补充“这个问题绝对是一个很难解决的问题”的说法,通过反转集合(使用所有可见素数的集合作为宇宙),问题变为找到“最小数量的集合,使得联合是宇宙”。这是 NP 完全的:en.wikipedia.org/wiki/Set_cover_problem
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2023-03-17
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多