簡體   English   中英

最長 Collatz 序列效率

[英]Longest Collatz sequence Efficiency

我正在嘗試回答Project Euler 的問題 14 ,不幸的是,我的代碼運行所需的時間比運行所需的時間長。 我怎樣才能讓它變得高效,我已經減少了它,但它仍然缺乏效率。 我的代碼如下

my_seq_final = []
for i in range(1000000, 0, -1):
    ans = i
    my_seq = [ans]
    while ans != 1:
        n = ans
        if n % 2 == 0:
            ans = n/2
        else:
            ans = 3*n + 1
        my_seq.append(ans)
    my_seq_final.append(my_seq)

tmp = 0
result = [0]
for j in my_seq_final[::-1]:
    if tmp < len(j):
        tmp = len(j)
        result[0] = j
    else:
        pass
print(result[0][0])

您可以使用備忘錄來避免多次計算相同的Collat​​z序列。

cache = {1: 1}
def collatz_count(n):
    if n not in cache:
        if n % 2 == 0:
            cache[n] = 1 + collatz_count(n / 2)
        else:
            cache[n] = 1 + collatz_count(3 * n + 1)
    return cache[n]

假設我用6調用此函數:

 In []: collatz_count(6)
 Out[]: 9

這是序列[6, 3, 10, 5, 16, 8, 4, 2, 1]的長度。 而且,緩存已被副作用修改:

 {1: 1, 2: 2, 3: 8, 4: 3, 5: 6, 6: 9, 8: 4, 10: 7, 16: 5}

此后,如果我用12調用該函數,則序列[12, 6, 3, 10, 5, 16, 8, 4, 2, 1]的長度(10)將很快被計算出來,因為第二項( 6)已經與其長度相關聯。

在您遇到的問題中,大多數所需的長度都將簡單地從緩存中檢索或通過很少的遞歸調用來計算。

具體來說,在指定范圍內,對collatz_count的平均調用collatz_count為:

  • 310.534203(無緩存);
  • 3.16861(帶緩存)。

PS:請注意,我選擇將緩存實現為Python字典。 生成的Collat​​z數確實增長得遠遠超過給定的10**6界限(即56,991,483,520是最大的“中間”值)。 此大小的數組將為99.9961%為空,但是至少需要〜111 GB(每個值2個字節)。

如果我正確閱讀了代碼,則說明您正在保存所有序列,最后確定最長的序列。

您只需確定當前序列的長度,然后將其與迄今為止找到的最長序列進行比較,就可以確定地減少內存消耗,從而加快處理速度。 如果需要打印,則可以保存。

您可以通過記錄數組中n處的序列長度來加快處理速度。 然后,當您嘗試一個新號碼時,可以檢查該號碼的長度是否已知,如果知道,只需將長度添加到當前序列長度即可。 這會使用內存,但比記錄整個序列要少。

here is my code: https://gist.github.com/deafarcade/d9472584c03bb850279deb5826db0ca0 and if u want to try it online its also on my blogspot: https://hyperlogicz.blogspot.com/2022/08/collatz-conjecture. html請回復我的代碼怎么樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM