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