How do I compute all possibilities for an array of numbers/bits (in python, or any language for that matter)
我已经连续三个小时绞尽脑汁了,但我还是不明白,所以我在这里问。(我在标题中写了python,但这几乎可以用于任何语言)
假设我有一个固定长度n的位数组(但它也可能是定义范围内的整数),比如5。
1 | array=[0,1,1,0,0] |
现在,如何生成所有数组,这些数组在数字范围内是可能的(在bits的情况下,是2)。
所以:
1 | [0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [0,0,0,1,1] ... |
我试过在这里寻找解决方案,但我总是找到一些相似的东西,但并不能完全解决我的问题。
为了解决这个问题,我尝试了各种循环,但是我总是不止一次得到一种可能性(不应该发生),或者没有得到所有可能的可能性。
我可以用if语句来实现这一点(检查组合是否已经存在),但这看起来非常简单。
有没有一个简单的方法,只使用循环,以获得所有的可能性?
谢谢你
编辑:因为这是下面提到的,不,这不是家庭作业。这是为了研究实现一个二进制状态的贝叶斯网络。(开/关)。
在python中,对类似的东西使用itertools
1 2 3 | from itertools import product for i in product([0,1], repeat=5): print i |
产量:
1 2 3 4 5 6 | (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... |
我将通过循环从0到31(0B111111)并将二进制表示转换为固定长度的数组来解决这个问题。
您没有用语言标记这个,所以我不知道如何给您提供示例代码,但是这种方法应该可以工作。
1 2 3 4 5 6 | 1: 00001 2: 00010 3: 00011 ... 30:11110 31:11111 |
编辑:刚刚看到你用python标记了这个问题。实现上述算法的python代码示例:
1 2 3 | listLength=5 for x in range(0,2**listlength): print(list(bin(x)[2:].zfill(listlength))) |
打印输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ['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'] |
这里有一个通用的递归伪代码来执行您所寻找的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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])"。有更好的方法来构建它,但是a)我太老了,做不了家庭作业;b)我不知道你的作业有什么限制;c)我不想让你作弊的事情变得太明显。
注意重复的代码和常见子表达式消除的机会,以及极其浪费的内存分配和缓存滥用。不过,我假设这是第一季度的计算机科学作业,所以他们可能不会反对你。
1 2 3 4 5 6 7 | 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'])) |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [[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']] |