我试图解决的问题是问题87.这个问题需要你找到低于50000000的主要三元组.到目前为止,代码已经运行了超过10分钟,有足够的时间来写这个.
28 = 2 ^ 2 + 2 ^ 3 + 2 ^ 4
33 = 3 ^ 2 + 2 ^ 3 + 2 ^ 4
49 = 5 ^ 2 + 2 ^ 3 + 2 ^ 4
47 = 2 ^ 2 + 3 ^ 3 + 2 ^ 4
在我的暴力方法中,我已经优化它,只检查小于50000000的方形,立方体和夸脱值.我使用筛子生成高达7071的数字,这不需要很长时间.
def algo(primes_matrix): suma = [] counter2 = 0; limit = 50000000 # square max, primes_matrix[907][1] = 7041 # cube max, primes_matrix[72][2] = 368 # quart max, primes_matrix[22][3] = 84 for n2 in range(0, len(primes_matrix)-1): # loop power 2 for n3 in range(0, 72): # loop power 3 for n4 in range(0, 22): # loop power 4 add = primes_matrix[n2][1] + primes_matrix[n3][2] if(add我只是开始学习Python,因此我宁愿使用C/C++来解决这类问题,因为我相信它会表现得更快.是这样的吗?或者更确切地说,我滥用Python的某些功能使其运行速度比它应该慢得多,或者以某种方式搞乱了我的算法.无论我是否会尝试在C中重新实现它以查看差异.谢谢你的帮助!
1> Untitled123..:没有足够的声誉来评论,但使用集合"in"是一个散列函数,其平均查找接近于O(1),而列表"in"需要O(n).针对此问题的Python解决方案可以在一秒钟内轻松运行.我将列出其他几个要考虑的优化:
add = primes_matrix [n2] [1] + primes_matrix [n3] [2]应该在for n4 ...循环之外,因为它的值不会改变并且你正在重新计算它.
只要add已经大于限制,就打破循环而不是继续迭代.