查找最小位数以区分一组二进制数的算法

时间:2016-10-21 08:27:12

标签: algorithm bits

假设我们有K个二进制数(每个都是相同的长度)。我们需要找到所需的最少位数(不需要是连续的)来唯一地识别这些K二进制数。例如100,110可以区分1位(在第二位置)。 111,110,101需要2位才能被区分。

2 个答案:

答案 0 :(得分:3)

我们可以将这些二进制看作一组线性方程。所以,例如 ,如果我们有这些二元:1111,1100,1001,我们可以将它们表示如下:

x1 + x2 + x3 + x4 = y1
x1 + x2 + 0  + 0  = y2
x1 + 0  + 0  + x4 = y3

从这里开始,我们意识到,我们可以使用Gaussian elimination来减少那些方程以消除额外的变量(在上面的示例中,它是x1)。减少的结果将设置K个不同的变量,我们删除一个额外的变量以获得原始问题的结果。

答案 1 :(得分:0)

Minimum Set Cover是根据集合 U U 子集的 S 集合定义的。 U 中的每个元素必须由 S 中的(至少)一个集合覆盖。

如果您可以解决Set Cover,也可以解决此问题。假设您构建了一个 U 集合,其中每个条目 u i,j (其中 i< j ),对应于 k 数字的对(i,j)(j,i)(因此 | U | = k (k - 1)/ 2 )。现在构建 n 集, S 1 ,...,S n ,对应 n 可能的位置。设置 S j 是对应于位置 j 的所有元素的子集。也就是说,如果数字 k,l 的位置 j 不同,则设置 u k,l ∈S j

然而,通过减少这是一个NP难题。通过贪婪的方法,您可以得到所需最小位数的有界近似值,但不是最小值。