我一直在学习python,这是我对NP完全问题(例如子集产品)的爱好和经验研究。我有算法,但是并没有按照我打算的方式进行。
我想做的是combinations
一旦itertools 到达输入变量的子集,就停止它target
。这会稍微加快代码的速度。该代码处于抛光阶段,因此有不必要的列表res_2
这是循环。
res_2 = []; for i in range(1, len(s)+1): var = (findsubsets(s, i)) kk = list(map(numpy.prod, var)) res_2.append(kk) if target in kk: print('yes') print(var) break
这是我不需要的输出。请注意,脚本不会在(4,4)处停止。一旦目标被“击中”,继续检查所有组合是浪费资源的。
Enter numbers WITH SPACES: 4 4 3 12 enter target integer: 16 yes [(4, 4), (4, 3), (4, 12), (4, 3), (4, 12), (3, 12)] ? kk [16, 12, 48, 12, 48, 36]
我的预期输出是在第一个“命中”处停止在(4,4)。对于其他任何子集,例如(1,2,3)或(1,2,3 ---任意长度),也是如此。我希望脚本继续执行直到找到匹配为止。一旦找到命中,它将停止,因为这将提高算法的速度。
# Naive Subset-Product solver # with python's itertools import itertools import numpy s = list(map(int, input('Enter numbers WITH SPACES: ').split(' '))) print('enter target integer: ') target = int(input()) if s.count(target) > 0: print('yes') quit() if target > numpy.prod(s): print('sorry cant be bigger than total product of s') quit() def findsubsets(s, n): return list(itertools.combinations(s, n)) # Driver Code n = len(s) # This code snippet is a for loop. It also is intended to cut down execution # time once it finds the target integer. (instead of creating all combinations) res_2 = []; for i in range(1, len(s)+1): var = (findsubsets(s, i)) kk = list(map(numpy.prod, var)) res_2.append(kk) if target in kk: print('yes') print(var) break
如何使它起作用以提高算法速度?哪些Python技巧可以解决我的问题?有没有更短的方法呢?