簡體   English   中英

Haskell中的整數時間復雜度

[英]Integer time complexity in Haskell

我上周在學校做了一項任務,實現了計算斐波納契數列中第n個數的函數。 “子指派”是使用累積(可能不是正確的翻譯)來實現它,以便給出函數O(n)時間復雜度。 這一切都很好,直到我嘗試制作函數(Int - > Integer)。 通過實驗,我意識到時間復雜度對於非常大的數字接近於O(n ^ 2)。 在我看來,這必須是因為Integer的實現,這使我對它的工作方式有點好奇。 我做了一些谷歌搜索,沒有找到任何看似有用的東西,所以我轉向你們,希望得到一個解釋或一個解釋徹底的鏈接。

我的代碼:

ackfib 0 = 0
ackfib 1 = 1        
ackfib n = loop n 1 0 1
    where
        loop n n1 n2 i 
            | i < n     = loop n (n1+n2) n1 (i+1)
            | i == n    = n1
            | i > n     = error "n must be greater than or equal to 0"

我很感謝所有答案

這與Haskell無關,這只是Fibonacci數量迅速呈指數增長的結果。 具體而言,第n個斐波那契數已約(日志2φ)n或大致0.48的n位,其中φ是黃金比例(1 + SQRT 5)/ 2,由於除了k位整數的花費O(k)的時間,你的O (n)加法實際上總共需要O(n ^ 2)時間,因為平均而言,你添加的數字有O(n)位。

(注意粘貼:大O應該是上面的大Theta。)

要添加到Reid的答案 ,您的算法具有O(N)時間復雜度的事實取決於您認為是執行步驟。 這是對時間復雜性的常見誤解:時間復雜度始終與執行時間相對應。

要考慮的步驟取決於我們想要分析問題的深度。 如果將步驟定義為Integer的一個加法,是的,帶累加器的算法在O(N)時間內運行。 如果將步驟定義為一個單詞添加(32位或64位加法),則它將以O(N ^ 2)運行,如Reid所述。

如果您希望您的復雜性分析與執行時間相對應,則需要使用執行步驟,其執行時間以常量為界,例如添加兩個處理器字。 添加整數不是,因為整數可以任意大。

暫無
暫無

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

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