【发布时间】:2016-04-19 16:31:17
【问题描述】:
我正在尝试编写一个脚本来确定是否可以在整数列表中分解整数值。我这样做的方法是在递归中搜索有效的分解,有效地在可能的因素树中进行 DFS(在下面的代码中)。是否有可能制作一个快速找到这个的贪心算法?我的想法是继续在列表中搜索余数中的最大因子,直到找到有效的因式分解。在这种情况下,这将是一个正确的算法吗?如果不是,这是否是 NP 中的问题?
用Python写的解决问题的代码:
def can_factorize_in_list(n, list):
# Determines whether it is possible to factorize 'n' in 'list'
# Filter the list to only include the values which are factors
fac_list = [p for p in list if (n % p is 0)]
for x in fac_list:
if n % x is 0:
if n/x is 1:
# If we end up at 1, we have a valid factorization
return 1 # End state
else:
# If we do not end at 1, keep trying
if can_factorize_in_list(n/x, fac_list):
return 1
else:
continue
return 0
编辑:例如,给定整数 30 和列表 [2,3,5,8],算法应该返回 True,因为 30 = 2*3*5。不需要使用列表中的所有元素,因为因子和因子可以多次使用。
【问题讨论】:
-
在整数列表中分解一个整数是什么意思?通常的解释是整数是列表的一个元素,而您只想分解整数(因此列表甚至无关紧要),但这似乎不是您要说的。是否需要来自列表的因素?如果可以,是否可以重复使用因子?
-
您无需重新检查
n%x is 0。您的fac_list已经过滤了这些值。else: continue也是不必要的。您可以将其重写为if n/x is 1 or can_factorize_in_list(n/x, fac_list): return True。并且请返回布尔值而不是0/1,这将使您的代码更清晰,更少hacky -
因子必须来自列表,是的。因子也可以多次使用。
-
不要使用
list作为变量名,你会隐藏内置的list。 -
问题出在 NP 中;如果输出为“是”,则有效的分解用作答案为“是”的多项式时间可检查的证书。
标签: python np factorization