Python 求素数算法的时间复杂度
我对素数很好奇,想知道找到相对较小的素数的最有效方法,比如说,1000万。我读到,erastossenes(SOE)的筛选是寻找较小素数的最有效方法。我使用python实现了SOE,但有几个问题:Python 求素数算法的时间复杂度,python,algorithm,primes,sieve-of-eratosthenes,Python,Algorithm,Primes,Sieve Of Eratosthenes,我对素数很好奇,想知道找到相对较小的素数的最有效方法,比如说,1000万。我读到,erastossenes(SOE)的筛选是寻找较小素数的最有效方法。我使用python实现了SOE,但有几个问题: 我的算法在最坏情况下的运行时间似乎是O(n^2)。我还在学习,所以我知道这个算法可以变得更有效 寻找素数的最有效的数学方法和最有效的编程方法有区别吗?从数学上讲,SOE是速度最快的之一,但从编程角度来看,SOE有那么快吗 def FindPrime(n): primes = [2, 3]
def FindPrime(n):
primes = [2, 3]
for num in range(4, n):
notprime = False
for p in primes:
if num % p == 0:
notprime = True
if notprime == False:
primes.append(num)
print primes
print FindPrime(100)
首先,你应该知道你的算法不是最好的。你用的是审判庭 可以对您的实现进行许多改进
xrange()
,即O(1)
内存,而不是range()
,即O(n)
xrange(4,n,2)
一次跳过第2步p>sqrt(n)
时,不要测试素数p
是否除以n
。这是不可能的至于更快的算法,首先实现一个真正的Eratosthenes筛,然后尝试更快的算法。首先,你应该知道你的算法不是最好的。你用的是审判庭 可以对您的实现进行许多改进
xrange()
,即O(1)
内存,而不是range()
,即O(n)
xrange(4,n,2)
一次跳过第2步p>sqrt(n)
时,不要测试素数p
是否除以n
。这是不可能的- 这使得prime查找比您的解决方案更有效
- 时间:
如果SQRT(n)是按照代码内部注释中的建议使用的T(0.5·n·DIGAMMA(CEIL(SQRT(n))+0.3511·n)
- 时间(n=1M):
T(3.80*n)
- 时间(n=10M):
T(4.38*n)
- 时间(n=100M):
T(4.95*n)
- 时间(n=1000米):
T(5.53*n)
- 因此,大约运行时间为:
T((0.3516+0.5756*log10(n))*n)
- 因此复杂性是
O(n.log(n))
- 实际运行时间是
t=t(f(n))*c
- 对于足够大的n,它收敛到
t=O(f(n))*c
- 其中
是算法的时间复杂度O()
- 而
是任意n的实际运行时方程(不是T()
!!!)O()
是一个恒定的时间,需要在所有c
过程中同时处理
s的单个过程
- 更好的
并不意味着更快的解决方案O()
- 对于任何
仅在treshold之后,其中n
O1(f1(n))*c1
- 因此,如果你很好地优化了
常数,那么你就可以把复杂度更好的算法提高到一个极限c
- 例如,您的代码大约是
->T(n.n/2)
O(n^2)
- 但是对于低n,可以比我的SOE更快
O(n.log(n))
- 因为我的需要准备表格,这在一定程度上要比你的除数花费更多的时间
- 但是在那之后你的速度会慢很多
- 答案是是它可以在定义的N范围内
- 这使得prime查找比您的解决方案更有效
- 时间:
如果SQRT(n)是按照代码内部注释中的建议使用的T(0.5·n·DIGAMMA(CEIL(SQRT(n))+0.3511·n)
- 时间(n=1M):
T(3.80*n)
- 时间(n=10M):
T(4.38*n)
- 时间(n=100M):
T(4.95*n)
- 时间(n=1000米):
T(5.53*n)
- 因此,大约运行时间为:
T((0.3516+0.5756*log10(n))*n)
- 因此复杂性是
O(n.log(n))
- 实际运行时间是
t=t(f(n))*c
- 对于足够大的n,它收敛到
t=O(f(n))*c
- 其中
是算法的时间复杂度O()
- 而
是任意n的实际运行时方程(不是T()
!!!)O()
是一个恒定的时间,需要在所有c
过程中同时处理
s的单个过程
- 更好的
并不意味着更快的解决方案O()
- 对于任何
仅在treshold之后,其中n
O1(f1(n))*c1
- 因此,如果你很好地优化了
常数,那么你就可以把复杂度更好的算法提高到一个极限c
- 例如,您的代码大约是
->T(n.n/2)
O(n^2)
- 但对我来说