【问题标题】:Finding a Set based on Bit Occurence根据位出现查找集合
【发布时间】:2019-02-06 21:38:58
【问题描述】:

我试图找到一列出现多次的位。让我给你举个例子:

       X Y Z   
Set A  0 1 0
Set B  0 0 1
Set C  0 1 0
Set D  0 0 0

通过 UNION 操作,我可以知道集合列表中哪一列的位设置为 1。如果我执行 A UNION B UNION C UNION D 那么我们得到 0 1 1 ,这意味着 X 列没有设置为 1 的位,Y 列和 Z 列至少有 1 个位设置为 1。

我的问题是我试图找到正确的设置操作来查找多次设置为 1 的列。在上面给出的示例中,Y 列有 2 位设置为 1。因此结果应该是 0 1 0

我尝试做交叉点,这是最合乎逻辑的做法,但会产生不同的结果。

我很感激有人可以指导我应该执行哪种集合操作组合来获得所需的结果。提前致谢。

【问题讨论】:

  • “算法”不是我们可以帮助您的编程语言。你打算在这里写什么代码?
  • @tadman 我不是试图通过编程语言编写代码,而是我正在寻找一种算法(步骤)来通过集合论/操作来解决问题。
  • Stack Overflow 是针对编程问题的,所以如果这更多的是数学/理论问题,那么这里就离题了。你可能想试试Quora
  • 我不知道如何从中创建确定性算法,但有一个推测可能会有所帮助-您可以获取每个集合之间的对称差异以及所有集合的并集,以及任何位设置为 1 表示这些位设置为 1 的偶数组(因此有效地达到 50% 的准确度)。在您的示例中,您将获得 A SYM-DIFF B ... SYM-DIFF (A UNION B ...) => 0 1 0

标签: algorithm set-theory


【解决方案1】:

我的问题是我试图找到正确的设置操作来查找多次设置为 1 的列。

这是一种方法:

(A∩B)∪(A∩C)∪(A∩D)∪(B∩C)∪(B∩D)∪(C∩D)

也就是说,数学非常灵活;你可以从字面上说“包含出现在至少两个集合中的所有元素的集合 A, B, C, D”,数学家在大多数情况下都会接受这一点。

【讨论】:

    【解决方案2】:

    USet_0 := 0 0 0DSet_0 := 0 0 0。然后我们定义

    USet_(k+1) := USet_k UNION Set_k | forall 0 <= k < n
    

    DSet_(k+1) := DSet_k UNION (USet_k INTERSECT Set_k) | forall 0 <= k < n
    

    找到所有n 集合的并集的操作然后产生USet_n。任何设置了多个位的列都由DSet_n 表示。

    【讨论】:

      【解决方案3】:

      当您尝试有效地执行此操作时,这会更有趣。

      从 0 开始按顺序为每组分配数字。

      那么,如果有一列在至少两个不同的集合中,那么这两个集合的数字一定是不同的,如果数字不同,那么这些数字的二进制表示将至少有一个不同位位置。

      所以:

      1. 对于集合数中的每个位位置b(有log(number_of_sets)个):

        1. 创建编号中设置了位 b 的所有集合的并集;

        2. 创建在其编号中设置位b的所有集合的并集;

        3. 将这两组相交。

      2. 创建所有这些交叉点的​​并集。

      完成。结果是出现在至少 2 个不同集合中的所有列的集合。

      例如,如果列同时在集合 5 和集合 7 中,那么它将在位位置 b=1 的交点中>(位置值为 2),因为 5 (101)7 (111) 的二进制表示是在那个位位置不同。该列将位于所有具有位 1 的数字集合的并集中,位于具有位 1 的所有集合的并集中开。

      所需的集合操作总数为N*log(N),其中N为集合数。

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2022-06-12
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多