[英]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.