确定某个汉明重量的二元矢量的所有子矢量组合

时间:2015-11-03 06:19:26

标签: java python c++

给定二进制向量 x ,并且数字 y 小于此二进制向量的汉明权重,我想返回相同的向量集大小为 x ,它们包含在 x 中,汉明重量 y

例如,二元向量' 0110110' y值为3,应该返回

  • 0110100
  • 0110010
  • 0100110
  • 0010110

y值为2的相同向量应返回

  • 0110000
  • 0100100
  • 0100010
  • 0010100
  • 0010010
  • 0000110

任何帮助将不胜感激!! 我使用python但是任何类似语言的例子都会很棒。 (C / Java等)

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是获取所有非零元素索引,从而找到所有这些索引的大小为y的组合。

例如:

二进制矢量:'0110110',y = 3, 索引是(1,2,4,5) 大小y = 3的组合将为indexes = [(1, 2), (1, 4), (1, 5), (2, 4), (2, 5), (4, 5)]

现在迭代上述组合并切断上面列表中每个项目索引的元素将是微不足道的

for i in index:
    binary_seq[i] = '0'

<强>实施

def foo(bin_seq, y):
    from itertools import combinations
    bin_seq = list(bin_seq)
    y = bin_seq.count('1') - y
    indexes = [i for i in range(len(bin_seq)) if bin_seq[i] == '1']
    for index in combinations(indexes,  y):
        vec = bin_seq[:]
        for i in index:
            vec[i] = '0'
        yield ''.join(vec)

示例

>>> list(foo('0110110', 3))
['0010110', '0100110', '0110010', '0110100']
>>> list(foo('0110110', 2))
['0000110', '0010010', '0010100', '0100010', '0100100', '0110000']