亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Eratosties篩-尋找Python的Primes

Eratosties篩-尋找Python的Primes

一只名叫tom的貓 2019-06-26 16:47:49
Eratosties篩-尋找Python的Primes我只想澄清一點,這不是家庭作業的問題:)我想為我正在構建的數學應用程序找到素數&偶然發現的。埃拉托斯提尼篩接近。我已經用Python編寫了它的實現。但速度太慢了。比方說,如果我想找到不到200萬的素數。需要超過20分鐘。(我在這一點上停止了它)。我怎么才能加快速度?def primes_sieve(limit):     limitn = limit+1     primes = range(2, limitn)     for i in primes:         factors = range(i, limitn, i)         for f in factors[1:]:             if f in primes:                 primes.remove(f)     return primesprint primes_sieve(2000)最新情況:最后,我對這段代碼進行了分析&發現在從列表中刪除元素上花費了相當多的時間。考慮到它必須遍歷整個列表(最壞的情況)來查找元素&然后刪除它,然后重新調整列表,這是完全可以理解的(也許會有一些副本繼續嗎?)不管怎么說,我把字典的單子扔掉了。我的新計劃-def primes_sieve1(limit):     limitn = limit+1     primes = dict()     for i in range(2, limitn): primes[i] = True     for i in primes:         factors = range(i,limitn, i)         for f in factors[1:]:             primes[f] = False     return [i for i in primes if primes[i]==True]print primes_sieve1(2000000)
查看完整描述

3 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

您沒有完全實現正確的算法:

在第一個例子中,primes_sieve不維護要刪除/取消設置的素數標志列表(如算法中的那樣),而是連續調整整數列表的大小,這是非常昂貴的:從列表中刪除項需要將所有后續項向下移動一項。

在第二個例子中,primes_sieve1保持一個字典對于素數標志,這是朝著正確的方向邁出的一步,但它以未定義的順序遍歷字典,并冗余地剔除因素(而不是像算法中那樣只剔除素數的因素)。您可以通過對鍵排序和跳過非素數(這已經使其速度快了一個數量級)來解決這個問題,但是直接使用列表仍然更有效。

正確的算法(使用列表而不是字典)看起來如下所示:

def primes_sieve2(limit):
    a = [True] * limit                          # Initialize the primality list
    a[0] = a[1] = False

    for (i, isprime) in enumerate(a):
        if isprime:
            yield i            for n in range(i*i, limit, i):     # Mark factors non-prime
                a[n] = False

(請注意,這還包括在素數平方處啟動非素數標記的算法優化(i*i)而不是它的雙倍。)


查看完整回答
反對 回復 2019-06-26
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

def eratosthenes(n):
    multiples = []
    for i in range(2, n+1):
        if i not in multiples:
            print (i)
            for j in range(i*i, n+1, i):
                multiples.append(j)eratosthenes(100)


查看完整回答
反對 回復 2019-06-26
?
米脂

TA貢獻1836條經驗 獲得超3個贊

從數組(列表)的開頭移除,需要在數組之后移動所有的項。這意味著從前面開始從列表中刪除每個元素都是O(n^2)操作。

通過設置,您可以更有效地完成這一任務:

def primes_sieve(limit):
    limitn = limit+1
    not_prime = set()
    primes = []

    for i in range(2, limitn):
        if i in not_prime:
            continue

        for f in range(i*2, limitn, i):
            not_prime.add(f)

        primes.append(i)

    return primesprint primes_sieve(1000000)

..或者,避免重新排列列表:

def primes_sieve(limit):
    limitn = limit+1
    not_prime = [False] * limitn
    primes = []

    for i in range(2, limitn):
        if not_prime[i]:
            continue
        for f in xrange(i*2, limitn, i):
            not_prime[f] = True

        primes.append(i)

    return primes


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 945 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號