【发布时间】:2019-05-01 13:40:25
【问题描述】:
我正在尝试完成以下挑战:https://app.codesignal.com/challenge/ZGBMLJXrFfomwYiPs。 我编写了似乎可以工作的代码,但是,它的效率太低以至于无法通过测试(执行时间过长并且使用了太多内存)。有什么方法可以提高效率吗?我对构建高效脚本很陌生。有人提到“map()”可以用来代替“for i in range(1, n)”。感谢 Xero Smith 和其他人提出的优化它的建议:
from functools import reduce
from operator import mul
from itertools import combinations
# Starting from the maximum, we can divide our bag combinations to see the total number of integer factors
def prime_factors(n):
p = 2
dct = {}
while n != 1:
if n % p:
p += 1
else:
dct[p] = dct.get(p, 0) + 1
n = n//p
return dct
def number_of_factors(n):
return reduce(mul, (i+1 for i in prime_factors(n).values()), 1)
def kinderLevon(bags):
candies = list()
for x in (combinations(bags, i) for i in range(1, len(bags)+1)):
for j in x:
candies.append(sum(j))
satisfied_kids = [number_of_factors(i) for i in candies]
return candies[satisfied_kids.index(max(satisfied_kids))]
任何帮助将不胜感激。
谢谢,
亚伦
【问题讨论】:
-
您认为是什么原因导致效率低下?
-
您需要先问自己几个问题:您认为什么需要时间复杂度?你认为什么会占用大量内存?一旦你确定了这一点,你就可以去尝试优化这些点。然而,这类挑战的解决方案通常是做一些完全不同的事情
-
例如有一个测试有 bag = [1, 11, 121, 1331, 14641, 151151, 22, 33, 666, 999]。这是一个问题,因为算法正在对这些数字进行所有可能的组合并将它们存储在一个数组中。我认为可能需要一个 map 或 yield 函数来停止将所有内容存储在数组中,就像它们目前一样。
-
对于初学者,将
factors的运行时间减半,一旦你达到 n/2 就停止,然后只需添加 n 本身(n 大于 n/2 的唯一因数)。此外,无需构建result列表,只需计算因素即可。 -
提出问题后,请不要使用给定的解决方案更新它,因为这会删除/使原始上下文无效,从而降低每个人的价值。
标签: python python-3.x algorithm optimization