在解决一些算法难题时,我偶然发现了一个问题,要求我将整数的所有可能分区都乘积为产品。
现在,我能想到的一种直截了当的方法是,在给定数字的质数分解的情况下,将它们全部集中到一个列表中,重复每一次必要的时间以表示其在分解中的功效,然后枚举该列表上的所有分区。
很显然,如果所有因子幂都为1,则此方法令人满意,但如果因子幂大于1,则冗余解决方案的总量就可以。
# List partitions, turn them into product partitions
# by multiplying the stuff in each subset and
# then remove identical ones and compare the results
def check_redundancy(s):
p = list(partitions(s))
pp = map(lambda x: tuple(sorted(map(prod, x))), p)
pp = list(pp)
print(f'Total partitions: {len(pp)}')
ps = set(pp)
print(f'Distinct product partitions: {len(ps)}')
就不必要的工作而言,结果令人失望:
>>> check_redundancy([2,2,3,3])
Total partitions: 15
Distinct product partitions: 9
>>> check_redundancy([2,2,2,2,2,3])
Total partitions: 203
Distinct product partitions: 19
>>> check_redundancy([2,2,2,2,2,2,3,3,3])
Total partitions: 21147
Distinct product partitions: 162
>>> check_redundancy([2,2,2,2,2,2,2,2,3,3,3])
Total partitions: 678570
Distinct product partitions: 401
因此,很明显,即使在成千上万的情况下,它的性能也会变得非常丑陋(如果将它们全部相乘,最后一个示例实际上只有6912)。我已经设法解决了素数幂的情况,因为您只需要获得幂的所有整数分区即可得到所有截然不同的乘积,但是不幸的是,对于具有两个或更多因子的情况,必须要做的事情是我到目前为止。
任何不产生所有多余案例的算法的想法都将受到赞赏!