找到唯一二元向量数的有效解决方案

时间:2016-11-01 16:54:11

标签: algorithm

假设您有一个长度为N的二进制向量(每个元素可以是0,1或X,对应于0或1)。

例如,给定N = 4:

1001是单个二进制矢量 1XX1表示四个不同的二进制向量{1001,1011,1101,1111}

现在假设您有三种不同的描述,例如

X11X 1XX1 11XX

找到这组规范描述的唯一二进制向量的数量有什么有效的解决方案?

请注意,当N增长时,强力解决方案变得不切实际,因此列出每个可能的向量并删除重复项不是一个可行的解决方案。另请注意,我们只想知道唯一向量的数量,但我们不需要计算它们的确切值。

使用此示例的解决方案进行编辑:

X11X - > 0110 0111 1110 1111

1XX1 - > 1001 1011 1101 1111

11XX - > 1100 1101 1110 1111

在这12个向量中,我们只想计算独特的向量,例如

0110 0111 1110 1111 1001 1011 1101 1100

2 个答案:

答案 0 :(得分:3)

我会使用inclusion-exclusion principle。你想知道集合的基数的基数。举个例子,你有:

N(X11X || 1XX1 || 11XX) = N(X11X) + N(1XX1) + N(11XX) - 
                          N(X11X && 1XX1) - N(X11X && 11XX) - N(1XX1 && 11XX) +
                          N(X11X && 1XX1 && 11XX)

“单个”元素的基数易于计算(2 ^ Nx,其中Nx是X个元素的数量)。对于交集,您可以逐个元素进行比较。如果它们与X不同并且彼此不同,则您为零。如果它们都相等,那么你就有1.如果你有一个X和一个数字,你就有一个。如果你有X和X,你有两个。然后你将这些数字相乘。一个例子:

N(X11X && 1XX1) = 1 * 1 * 1 * 1 = 1.

,其对应于唯一的公共序列(1111)。这可以很容易地推广到任何N,并且不应该难以用任何语言实现。

答案 1 :(得分:2)

如果模式的数量保持很小,那么您可以使用包含 - 排除类型方法来解决这个问题。

每个单独模式的二进制向量的数量很容易计算:它只是2的适当幂。现在模式的总数只是每个模式的二进制向量的总和,减去二进制的数量每对模式的公共解决方案的向量,加上每个三元组的公共解的数量之和,等等。

设定模式的常见解决方案也是单个模式的解决方案:如果在某个位置,一个模式具有0而另一个模式具有1,则没有通用解决方案。否则,如果其中一个模式在该位置具有0或1,则通过将0或1放置在某个位置来获得模式,如果所有模式在该位置具有X,则获得X.