【问题标题】:Special Binary Codes特殊二进制代码
【发布时间】:2023-12-31 16:04:02
【问题描述】:

找到 n 个长度为 n 的二进制代码,使得每对之间的距离为 n/2 ,其中 n 是偶数,如果可能的话?如何生成所有代码? 例如 n=4 我们有 1110,1101,1011,0111 每对有距离 2。 一对代码之间的距离是指两个代码字中不同比特的数量。 例如 1110 和 1101 ,只有最后两位不同,所以这对之间的距离是 2。

【问题讨论】:

  • “距离”是什么意思?什么是一对?
  • @Kevin pair 不是 that 抽象,并且距离问题很清楚:一对是两个值,例如 (1110,1101),距离是这两个值的位数不同,就像上面的一对:不同的位是 0 和 1,因此距离 = 2
  • 哦,我还以为可能是“零点位置的差异”,这让我对“对”的定义产生了疑问,因为11100111 有一个“位置差异” 3.

标签: algorithm wolfram-mathematica adhoc hamming-distance


【解决方案1】:

这个问题的主要难点在于有几种解决方案可以产生所需的解决方案。例如在您的问题中:

  • 1110 , 1101 , 1011 , 0111

  • 1000 , 0100 , 0010 , 0001

  • 1100 , 1001 , 0011 , 0110 , 1010 , 0101 , 0000 (*1关于0000的注释)

将是所有有效的解决方案(忽略顺序)。

一般来说,我们可以假设在任何解决方案中,每个值都有相同数量的 0 位。证明:
n 的解决方案S{a , b , ...} 组成。假设S 中的每个值都恰好有x 0 位,除了一个值(c'),它有x + 1 0 位。现在到一个值的距离仍然是n/2,但对于其余的距离是n / 2 + 1,因为增加了 1 位。

a = a1  a2  a3  a4  a5  ...
b = b1  b2  b3  b4  b5 ...
c = c1  c2  c3  c4  c5  ...
c'= c1' c2' c3' c4' c5' ...

如果例如c3 != c3'cx == cx' for any x != 3,则到任何其他值v 的距离,其中v3 != c3' 将始终为n / 2 + 1v3 == c3' n / 2 - 1。如果cS 的元素,则解决方案S 将是有效的。如果 c'S 的一个元素,则 S 不再是有效的解决方案。

下一步: 大多数元素的解决方案是包含max(binomial_coefficient(n , x)) 的解决方案,其中x 是0 的数量。因此,最佳解决方案是:

  • x = n/2,如果2 | n

此解决方案将是一组binomial_coefficient(n , n/2) + 1 值。

所以基本上我们在 n 位值中搜索 x 1 的所有排列。不过不会在这里发布任何代码,因为这个问题已经得到了很多人的回答。

*1: x = n / 2 的解决方案允许 0000 以及任何 n 的解决方案。如果x != n / 2,则不是

【讨论】:

  • 你能举出 n=6 或 8 的例子吗?或提供任何以前的链接?
  • @subratsingh 这个答案适用于任何nn = 8 产生一组 70 个不同的值,所以...
  • @subratsingh 简化事情:答案的相关部分是,解决方案的每个值必须具有相同数量的 0 位,并且具有最多位的解决方案将具有 n/2每个值 0 位,将产生 binomial_coefficient(n , n/2)
  • @Paul,看看我的结果。也许我错误地解释了这个问题,但我的一些解决方案违反了你的相同数量的零规则。
  • @agentp 是什么语言?林克? 个解决方案不适用 0 规则。但是,如果您正在寻找具有最多值的解决方案,您将不得不依赖 0 规则。虽然我忘记提及一个特殊规则:对于n=4,我最大的解决方案是缺少{0,0,0,0} 作为附加值。可能是我也误解了操作问题......
【解决方案2】:

一种完全蛮力的数学方法——不幸的是,这打破了我对 n>4.. 的记忆。

n = 4;
Select[ Subsets[Tuples[{0, 1}, {n}], {n}] ,
     And @@ Flatten@
      Outer[((# == n/2 || # == 0) &@Total@Abs@Subtract@##) & , # , #, 
          1 ] & ]

32 种解决方案中的一些:

编辑,解释一下: Tuples[{0, 1}, {n}] 给出所有2^n n 位序列。 Subsets[ Tuples ,{n} ] 给出所有唯一的无序长度-n 组元组( 1820 表示 n=4 ) Select 从符合条件的集合中进行选择。 Outer 将测试应用于集合中的每一对(注意我们有 == n/2 or 0 因为Outer 对每个二进制文件进行自我测试,自测结果为零)

请注意,每个子集都可以以 n! 的方式重新排序,因此对于 n=4,如果您认为顺序很重要,那么应该有 768 个独特的解决方案。

【讨论】: