Algorithm 找到最少数量的位序列OR以实现所有1';s

Algorithm 找到最少数量的位序列OR以实现所有1';s,algorithm,bit-manipulation,bit,Algorithm,Bit Manipulation,Bit,我试图找到任何可能有助于这项任务的东西:我有一个可变数量的位序列(每个位序列的长度都相同),我需要找到哪个序列组合会或所有1,使用尽可能少的序列。我想从哪个序列的1最多开始,然后尝试填充空格,但由于我没有进行位比较,我真的不知道是否有某种算法或位逻辑属性可以简化这一过程。谢谢。不幸的是,这个问题在最一般的情况下是NP难的,从中减少。在集合覆盖问题中,您有一组元素,并希望找到其并集包含所有元素的最小数量的元素。如果给定集合的每个位置都有一个1,如果给定集合的每个位置都有一个0,则可以为每个集合构造

我试图找到任何可能有助于这项任务的东西:我有一个可变数量的位序列(每个位序列的长度都相同),我需要找到哪个序列组合会或所有1,使用尽可能少的序列。我想从哪个序列的1最多开始,然后尝试填充空格,但由于我没有进行位比较,我真的不知道是否有某种算法或位逻辑属性可以简化这一过程。谢谢。

不幸的是,这个问题在最一般的情况下是NP难的,从中减少。在集合覆盖问题中,您有一组元素,并希望找到其并集包含所有元素的最小数量的元素。如果给定集合的每个位置都有一个1,如果给定集合的每个位置都有一个0,则可以为每个集合构造一个位向量,从而轻松地将集合覆盖问题简化为您的问题。其或给出所有1的最小位向量数等于其并集包含所有元素的最小集合组

例如,给定集合{a,b,e},{b,c},{b,d,f}和{a,f},您将得到以下位向量:

 {a, b, e}    110010
 {b, c}       011000
 {b, d, f}    010101
 {a, f}       100001
由于集合覆盖问题是已知的NP难问题,这意味着除非p=NP,否则您的问题没有多项式时间算法。更糟糕的是,我们知道,在多项式时间内,您无法在因子O(logn)内逼近最优解,其中n是总元素数。您最好寻找启发法,或者使用保持满足于O(logn)近似值


希望这有帮助

不幸的是,这个问题在最一般的情况下是NP难的,从中减少。在集合覆盖问题中,您有一组元素,并希望找到其并集包含所有元素的最小数量的元素。如果给定集合的每个位置都有一个1,如果给定集合的每个位置都有一个0,则可以为每个集合构造一个位向量,从而轻松地将集合覆盖问题简化为您的问题。其或给出所有1的最小位向量数等于其并集包含所有元素的最小集合组

例如,给定集合{a,b,e},{b,c},{b,d,f}和{a,f},您将得到以下位向量:

 {a, b, e}    110010
 {b, c}       011000
 {b, d, f}    010101
 {a, f}       100001
由于集合覆盖问题是已知的NP难问题,这意味着除非p=NP,否则您的问题没有多项式时间算法。更糟糕的是,我们知道,在多项式时间内,您无法在因子O(logn)内逼近最优解,其中n是总元素数。您最好寻找启发法,或者使用保持满足于O(logn)近似值


希望这有帮助

我对这个问题考虑了一下,下面是我的想法:

  • 首先,您为每个位创建一个列表,在每个列表中,您将找到在此位上有“1”的每个序列。这需要O(n*m)being n表示序列的数量,m表示特定序列的长度

  • 然后计算每个位序列的所有出现次数,将所有这些[List,Integer]元组抛出到一个结构(AVL树或堆或任何您喜欢的)中,并对它们进行排序。(我的意思是:序列“a”在所有列表中出现15次,序列b出现10次)。这又需要O(n*m),因为O(nlogn)
  • 在下一步中,使用具有最高优先级的序列,并删除包含此序列的步骤1的所有列表。然后返回步骤2,直到删除所有列表。在最坏的情况下,你必须这样做m次

总的来说,我们的时间是O(n*m^2) 如果我误解了问题的一部分或我犯了错误,请纠正我;) 这里有一个小例子来说明我的意思:
位字符串:
a:100101
b:010001
c:011100
d:000010

因此,这将创建列表:
L1:a
L2:b,c
L3:c
L4:a,c
L5:d
L6:a,b

然后我们将进行计数和排序:
a:3
c:3
b:2
d:1

因此,我们在最终列表中加入a并删除以下列表:
L1,L4,L6

现在我们再次计数:
c:2
b:1
d:1

因此,我们在列表中使用c并删除:
L2,L3
所以我们只剩下L5,其中只包含d


所以我们找到了最后的最小集:a,c,d,我对这个问题考虑了一下,下面是我的想法:

  • 首先,您为每个位创建一个列表,在每个列表中,您将找到在此位上有“1”的每个序列。这需要O(n*m)being n表示序列的数量,m表示特定序列的长度

  • 然后计算每个位序列的所有出现次数,将所有这些[List,Integer]元组抛出到一个结构(AVL树或堆或任何您喜欢的)中,并对它们进行排序。(我的意思是:序列“a”在所有列表中出现15次,序列b出现10次)。这又需要O(n*m),因为O(nlogn)
  • 在下一步中,使用具有最高优先级的序列,并删除包含此序列的步骤1的所有列表。然后返回步骤2,直到删除所有列表。在最坏的情况下,你必须这样做m次

总的来说,我们的时间是O(n*m^2) 如果我误解了问题的一部分或我犯了错误,请纠正我;) 这里有一个小例子来说明我的意思:
位字符串:
a:100101
b:010001
c:011100
d:000010

因此,这将创建列表:
L1:a
L2:b,c
L3:c
L4:a,c
L5:d
L6:a,b

然后我们将进行计数和排序:
a:3
c:3
b:2
d:1

因此,我们在最终列表中加入a并删除以下列表:
L1,L4,L6

现在我们再次计数:
c:2
b:1
d:1

因此,我们在列表中使用c并删除:
L2,L3<