Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求素数算法的时间复杂度_Python_Algorithm_Primes_Sieve Of Eratosthenes - Fatal编程技术网

Python 求素数算法的时间复杂度

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]

我对素数很好奇,想知道找到相对较小的素数的最有效方法,比如说,1000万。我读到,erastossenes(SOE)的筛选是寻找较小素数的最有效方法。我使用python实现了SOE,但有几个问题:

  • 我的算法在最坏情况下的运行时间似乎是O(n^2)。我还在学习,所以我知道这个算法可以变得更有效

  • 寻找素数的最有效的数学方法和最有效的编程方法有区别吗?从数学上讲,SOE是速度最快的之一,但从编程角度来看,SOE有那么快吗

    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
    。这是不可能的

  • 正如您所预测的,这些更改不会影响复杂性的顺序,但您将看到性能的稳步提高

    至于一个更快的算法,首先实现一个真正的埃拉托斯坦筛,然后尝试更快的算法

  • uʍopǝpısdn是对的您的代码不是SOE

  • 您可以找到我的SOE实现

    • 这使得prime查找比您的解决方案更有效
  • 国有企业矿山实施的复杂性

    • 时间:
      T(0.5·n·DIGAMMA(CEIL(SQRT(n))+0.3511·n)
      如果SQRT(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))
  • 速度(运行时)和复杂性之间的差异O()

    • 实际运行时间是
      t=t(f(n))*c
    • 对于足够大的n,它收敛到
      t=O(f(n))*c
    • 其中
      O()
      是算法的时间复杂度
    • T()
      是任意n的实际运行时方程(不是
      O()
      !!!)
    • c
      是一个恒定的时间,需要在所有
      过程中同时处理
      s的单个过程
    • 更好的
      O()
      并不意味着更快的解决方案
    • 对于任何
      n
      仅在treshold之后,其中
    • O1(f1(n))*c1
    • 因此,如果你很好地优化了
      c
      常数,那么你就可以把复杂度更好的算法提高到一个极限
    • 例如,您的代码大约是
      T(n.n/2)
      ->
      O(n^2)
    • 但是对于低n,可以比我的SOE更快
      O(n.log(n))
    • 因为我的需要准备表格,这在一定程度上要比你的除数花费更多的时间
    • 但是在那之后你的速度会慢很多
  • 那么对于最有效的数学和编程解决方案之间是否存在差异的问题

    • 答案是它可以在定义的N范围内
  • uʍopǝpısdn是对的您的代码不是SOE

  • 您可以找到我的SOE实现

    • 这使得prime查找比您的解决方案更有效
  • 国有企业矿山实施的复杂性

    • 时间:
      T(0.5·n·DIGAMMA(CEIL(SQRT(n))+0.3511·n)
      如果SQRT(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))
  • 速度(运行时)和复杂性之间的差异O()

    • 实际运行时间是
      t=t(f(n))*c
    • 对于足够大的n,它收敛到
      t=O(f(n))*c
    • 其中
      O()
      是算法的时间复杂度
    • T()
      是任意n的实际运行时方程(不是
      O()
      !!!)
    • c
      是一个恒定的时间,需要在所有
      过程中同时处理
      s的单个过程
    • 更好的
      O()
      并不意味着更快的解决方案
    • 对于任何
      n
      仅在treshold之后,其中
    • O1(f1(n))*c1
    • 因此,如果你很好地优化了
      c
      常数,那么你就可以把复杂度更好的算法提高到一个极限
    • 例如,您的代码大约是
      T(n.n/2)
      ->
      O(n^2)
    • 但对我来说