我有一个简单的数学算法。所有它做的是它需要输入并找到i,j使得i ^ 2 + j ^ 2 =具有j> = i的限制的输入(因此它不打印它的对应物例如,2 ^ 2 + 3 ^ 2 == 3 ^ 2 + 2 ^ 2但我只需要后者为j> = i)
对于我的代码,我做了以下内容:我有2个for循环,第一个循环用于i,第二个循环用于j。取i和j值并测试i ^ 2 + j ^ 2 ==输入和j> = i。如果是,请打印并更新计数。
问题是,如果值很大,则需要很长时间,因为它从1到2000循环两次,然后再次从1到2000循环。
def some_mathfn(n):
count = 0
for i in range(1,n+1):
for j in range(1,n+1):
if(i**2 + j**2 == n and j >= i):
g = print(i, '^2 + ', j,'^2')
count += 1
return count
some_mathfn(2001)
答案 0 :(得分:9)
你有一个O(n 2 )算法没有明显的原因。这个O(n 1/2 )很容易制作......
n/2
的平方根(对于变量i
) - 因为当i
大于sqrt(n/2)
时,i*i + j*j
会更大对于大于n
的任何j
,i
以上。
n
的平方根,因为i
j
最后两步实际上只是检查n - i*i
的平方根实际上是一个整数,但在某些情况下(对于非常大的n值)找到最接近的整数然后检查条件可能是更可靠的方法,以避免引起问题的浮点限制,其中理论结果的最近可表示的两倍可以是整数,尽管实际结果不是整数。这只会发生在非常大的n值,但是......