【问题标题】:Computing unique intersections of subsets计算子集的唯一交集
【发布时间】:2013-03-26 02:10:29
【问题描述】:

给定一个集合 S = {si : {zj : z ∈ N} },什么是计算 S 的子集的唯一交集的高效算法?

作为背景,我正在处理这个问题的几个版本,有些版本比其他版本大。在最小的一个|S| ≈ 1,000, |si| ≈ 10,000,值是邮政编码。

为了清晰起见的小例子:

输入:S = {{},{1},{2,3},{3,4,5,6,7,8,9,10}} 输出:{{},{1},{2,3},{3,4,5,6,7,8,9,10},{3}}

|S| = 4 并且有 24 = 16 个 S 的子集。 但是,只有五组独特的子集交集。前四个是 S 本身的成员。第五个是{3}。空集已经是 S 的成员。所有其他 10 个子集交集也产生空集。

【问题讨论】:

  • 我想你要找的只是一个简单的集合交集算法,看看[线性交集算法] (stackoverflow.com/questions/4642172/…)
  • @amas S 有 2^n 个子集,S 有 1000 多个元素。 O(n) 交集算法没有帮助。交叉路口不是 IMO 的问题,它决定了哪些交叉路口不要做。
  • 抱歉 4,也许我没有理解这个问题。你能提供更多细节吗?
  • @amas 我不确定您还需要什么其他详细信息。如果你把所有 2^|S| S 的子集并与它们相交,2^|S| 中的唯一集将非常少结果。我正在寻找那些独特的套装。
  • 你如何定义subsetintersection?例如,S1 = {{1}, {2,3}}S2 = {{}, {1}, {2,3}}S 的子集,它们的交集是 (S1 & S2) == {{1}, {2,3}} 即,交集的成员本身就是集合,因此一组交集是一组集合(交集)的集合( S)。你如何让输出只是一组集合?

标签: performance algorithm set intersection discrete-mathematics


【解决方案1】:

渐近时间复杂度:

n:集合的数量,在执行过程中会改变

m:平均集合大小

时间: T(Search-Matching-Sets) x T(Intersection) x SUM { k } for k: 1..n

时间: 2m x 2m x 1/2 n(n+1)

时间: O(4 m^2 x 1/2 n x (n+1)) ~ O(n^2 m^2)

建议算法:

FOR i: 1..n
{

    FOR j: i..n
    {

        IF i = j THEN SKIP

        INTERSECTION := FIND-INTERSECTION ( SETS[i], SETS[j] )

        IF INTERSECTION ⊄ SETS[] THEN ADD INTERSECTION TO SETS[]

    }

}

【讨论】:

    【解决方案2】:

    这是一个可能值得的快速预处理步骤。

    调用元素 x 和 y 等价 如果对于每个集合 si,x 和 y 都属于或不属于 si .通过删除除每个等价类的一个代表之外的所有元素来简化问题。最后,将每个代表展开到它的类。

    为简化起见,逐个扫描集合,同时维护从每个元素到其等价类的标签的映射,其中等价是相对于目前处理的集合确定的。最初,所有元素都在同一个类中,因此此映射将每个元素发送到相同的标签。要处理一个集合,请初始化一个新标签的空映射。对于集合中的每个元素 x,设 k 为 x 的当前标签。如果新标签映射中存在键 k,则 k 对应的值成为 x 的新标签。否则,我们分配一个新标签并将其分配给 x 并添加从 k 到新标签的映射。

    这是您输入的执行情况。

    1. 初始标签 = {1:a, 2:a, 3:a, 4:a, 5:a, 6:a, 7:a, 8:a, 9:a, 10:a}。李>
    2. 扫描 {}。什么都没有发生。
    3. 扫描 {1}。将标签[1] 更改为 b。
    4. 扫描 {2, 3}。将 label[2] 和 label[3] 改为 c。
    5. 扫描 {3、4、5、6、7、8、9、10}。将 label[3] 更改为 d,将 label[4..10] 更改为 e。
    6. 最后,label = {1: b, 2: c, 3: d, 4: e, 5: e, 6: e, 7: e, 8: e, 9: e, 10: e} .选择 1 (b) 和 2 (c) 以及 3 (d) 和 4 (e) 来表示他们的类。其他所有内容均已删除。

    【讨论】:

    • 有趣。它没有解决问题,但它给了我一个好主意,让我可以用不同的方式解决整个问题,所以我会奖励答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多