如何计算的数字/位的阵列中的所有可能性(在python,或任何与此有关的语言)(How do I c

2019-07-01 11:11发布

我一直令人头大我的脑子了3个小时了,但我还是不明白这一点,所以我问在这里。 (我在标题写的Python,但是这可能是几乎任何语言)

假设我有一组位(但它也可以是在限定的范围内的整数)固定长度为n的,让我们说5。

array=[0,1,1,0,0]

现在,我如何生成的所有阵列,这在数目范围是可能的(在比特的情况下,2)。

所以:

[0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [0,0,0,1,1] ...

我试图寻找此解决方案,但我总能找到的东西是相似的,但并没有完全解决我的问题。

为了解决这个问题,我已经尝试了各种环路,但我总是最后要么得到一个可能不止一次(不应发生),或者没有得到所有可能的。

我可以管理与if语句(检查组合已经存在)要做到这一点,但似乎很不成熟。

有一个简单的方法,只使用循环,获得所有的可能性?

谢谢

编辑:既然这是下面提到的,不,这不是功课。 这是研究,以实现二进制状态的贝叶斯网络。 (开关)。

Answer 1:

在Python中,使用itertools像这样的东西

from itertools import product
for i in product([0,1], repeat=5): 
    print i

产量:

(0, 0, 0, 0, 0)
(0, 0, 0, 0, 1)
(0, 0, 0, 1, 0)
(0, 0, 0, 1, 1)
(0, 0, 1, 0, 0)
etc...


Answer 2:

我将由从0到31(0b11111)只是循环和转动的二进制表示成固定长度的阵列处理这个问题。

你没有用语言标记这一点,所以我不知道如何给你的示例代码,但这种做法应该工作。

1: 00001
2: 00010
3: 00011
...
30:11110
31:11111

编辑:刚才看到你标记与Python这个问题。 示例Python代码实现上述算法:

listLength=5
for x in range(0,2**listlength):
    print(list(bin(x)[2:].zfill(listlength)))

打印出:

['0', '0', '0', '0', '0']
['0', '0', '0', '0', '1']
['0', '0', '0', '1', '0']
['0', '0', '0', '1', '1']
['0', '0', '1', '0', '0']
['0', '0', '1', '0', '1']
['0', '0', '1', '1', '0']
['0', '0', '1', '1', '1']
['0', '1', '0', '0', '0']
['0', '1', '0', '0', '1']
['0', '1', '0', '1', '0']
['0', '1', '0', '1', '1']
['0', '1', '1', '0', '0']
['0', '1', '1', '0', '1']
['0', '1', '1', '1', '0']
['0', '1', '1', '1', '1']
['1', '0', '0', '0', '0']
['1', '0', '0', '0', '1']
['1', '0', '0', '1', '0']
['1', '0', '0', '1', '1']
['1', '0', '1', '0', '0']
['1', '0', '1', '0', '1']
['1', '0', '1', '1', '0']
['1', '0', '1', '1', '1']
['1', '1', '0', '0', '0']
['1', '1', '0', '0', '1']
['1', '1', '0', '1', '0']
['1', '1', '0', '1', '1']
['1', '1', '1', '0', '0']
['1', '1', '1', '0', '1']
['1', '1', '1', '1', '0']


Answer 3:

这里是一个广义递归的伪代码,你在寻找什么。

array_combination is function (length, elements)
  if length < 1 
  then abort
  end if

  declare arrays as new array
  if length is 1 
  then
    loop for element in elements
      declare element_array as new array
      set element_array[0] to element
      append element_array to arrays
    end loop
  else
    loop for array in array_combination(length - 1, elements)
      loop for element in elements
        declare element_array as new array
        set element_array[0] to element
        append array to element_array
        append element_array to arrays
      end loop
      append array to arrays
    end loop
  end if
  return arrays
end function

你会调用该函数为“array_combination(5,[1,0])”为您给出的例子。 有更好的方法来建立,但一)我太老了做功课,B)我不知道你的任务的约束,以及c)我不想弄得太明显,你被骗了。

注意常见的子表达式消除与极端浪费内存分配和缓存滥用沿着重复的代码和机会。 然而,我假设这是第一季度计算机科学分配,所以他们可能不会记仇的。



Answer 4:

import numpy as np
def all_combinations(width, vals):
    return np.array(np.meshgrid(*[vals]*width,
                    indexing='ij')).reshape((width,-1)).transpose()

print(all_combinations(width=3, vals=[0,1]))
print(all_combinations(width=2, vals=['a','b','c']))

输出:

[[0 0 0]
 [0 0 1]
 [0 1 0]
 [0 1 1]
 [1 0 0]
 [1 0 1]
 [1 1 0]
 [1 1 1]]
[['a' 'a']
 ['a' 'b']
 ['a' 'c']
 ['b' 'a']
 ['b' 'b']
 ['b' 'c']
 ['c' 'a']
 ['c' 'b']
 ['c' 'c']]


文章来源: How do I compute all possibilities for an array of numbers/bits (in python, or any language for that matter)