想要用随机生成的数组去穷尽所有可能还是不太现实,长度为n的数列,一共就有2^n种可能,我试了一下,如果是4个数,也就是16种情况,在1000次重复下,平均要随机生成53次才能全部生成全部可能,最多的要156次。若果有10个数生成1024种的话,我的电脑已经跑不动了,5个数512种的话平均3447次,最多的4976次。所以用随机的方式去生成所有情况是不现实的,肯定是穷举法比较现实。
import numpy as np
#生成系数矩阵
def func(n):
xs = {1:[[0],[1]]}
i = 1
while i
x_list = []
for x in xs[i]:
x_list.append(x + [0])
x_list.append(x + [1])
i+=1
xs[i] = x_list
return xs[n]
#输入任意数,给定k,输出求和结果
def main(input_list,k):
x = np.array(input_list)
n = len(input_list)
func_n = func(n)
func_T = np.array(func_n).T
result = np.dot(x,func_T)
for index,name in enumerate(result):
if name == k:
print(func_n[index])
start = time.time()
main([1,2,3,4,5,6,7,8,9,10],10)
end = time.time()
print(end-start)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 1, 0, 0]
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0]
[1, 0, 0, 1, 1, 0, 0, 0, 0, 0]
[1, 0, 1, 0, 0, 1, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0, 1, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
0.0020003318786621094
10个数也是挺快的
20个数稍微慢点3.55秒
因为毕竟是穷尽,时间复杂度应该是O(n^2)个数越多时间越长。
可以优化一下,比如先剔除出不可能的解之类的。