我寫的利用應爲O運行(日誌(n))的通話時間和矩陣冪算法得出的算法通過快速增加一倍相當標準的斐波那契功能,但攤上了大約超過1,000,000 - 即使這應該只是大約25個電話。快速斐波納契慢如蝸牛超過1,000,000
代碼:
"""
O(log(n)) time fibonacci algorithm using fast doubling derived from the matrix
squaring algorithm for the same thing.
"""
def fibonacci(num):
"O(log(n)) implementation of fibonacci using fast doubling."
if num >= 0:
return fib_helper(num)[0]
def fib_helper(num):
"Helper function for fibonacci()."
if num == 0:
return (0, 1)
elif num == 1:
return (1, 1)
else:
f_k, f_k_1 = fib_helper(num // 2)
f_k_even = f_k * (2 * f_k_1 - f_k)
f_k_odd = f_k_1 * f_k_1 + f_k * f_k
return (f_k_even, f_k_odd) if num % 2 == 0 else (f_k_odd, f_k_even +
f_k_odd)
此代碼應該僅產生的log(n)調用fib_helper和一個呼叫斐波那契數。對於大於1,000,000的數字,它只是停頓而不返回。
我試圖實現一個基本的裝飾來計算函數調用它告訴我,它僅運行32呼籲2^32,但它仍然在最後攤出來。
這是爲什麼要放緩大整數停止?
嘗試使用'decimal。十進制「並將小數精度設置爲」非常大「。然後輸出轉換時間將變得微不足道(十進制數字的線性) - CPython binary-> decimal轉換時間是位數的二次方。 –
如果數量變大,即使計算部分運行速度太慢。在我的電腦上,fib(10,000,000)需要永遠運行。 – satoru
@ Satoru.Logic,在這臺計算機上'fib(1000000)'需要不到100ms –