Fibonacci รุ่นเรียกซ้ำที่ไร้เดียงสาเป็นแบบยกกำลังโดยการออกแบบเนื่องจากการซ้ำซ้อนในการคำนวณ:
ที่รากคุณกำลังคำนวณ:
F (n) ขึ้นอยู่กับ F (n-1) และ F (n-2)
F (n-1) ขึ้นอยู่กับ F (n-2) อีกครั้งและ F (n-3)
F (n-2) ขึ้นอยู่กับ F (n-3) อีกครั้งและ F (n-4)
ถ้าคุณมีการเรียกซ้ำแบบเรียกซ้ำระดับ 2 แต่ละระดับซึ่งสูญเสียข้อมูลจำนวนมากในการคำนวณฟังก์ชันเวลาจะมีลักษณะดังนี้:
T (n) = T (n-1) + T (n-2) + C พร้อมค่าคงที่ C
T (n-1) = T (n-2) + T (n-3)> T (n-2) จากนั้น
T (n)> 2 * T (n-2)
...
T (n)> 2 ^ (n / 2) * T (1) = O (2 ^ (n / 2))
นี่เป็นเพียงขอบเขตที่ต่ำกว่าที่จุดประสงค์ของการวิเคราะห์ของคุณควรจะเพียงพอ แต่ฟังก์ชันเรียลไทม์เป็นปัจจัยของค่าคงที่ด้วยสูตรฟีโบนักชีเดียวกันและรูปแบบปิดเป็นที่รู้กันว่าเป็นการอธิบายอัตราส่วนทองคำ
นอกจากนี้คุณสามารถค้นหาฟีโบนัชชีรุ่นที่ปรับให้เหมาะสมโดยใช้การเขียนโปรแกรมแบบไดนามิกเช่นนี้:
static int fib(int n)
{
/* memory */
int f[] = new int[n+1];
int i;
/* Init */
f[0] = 0;
f[1] = 1;
/* Fill */
for (i = 2; i <= n; i++)
{
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
นั่นคือการปรับให้เหมาะสมและทำเพียงnขั้นตอน แต่ก็ยังเป็นที่ชี้แจง
ฟังก์ชันต้นทุนถูกกำหนดจากขนาดอินพุตจนถึงจำนวนขั้นตอนเพื่อแก้ไขปัญหา เมื่อคุณเห็นรุ่น Fibonacci แบบไดนามิก ( ขั้นตอนnในการคำนวณตาราง) หรืออัลกอริทึมที่ง่ายที่สุดที่จะรู้ว่าตัวเลขนั้นเป็นจำนวนเฉพาะ ( sqrt (n)เพื่อวิเคราะห์ตัวหารที่ถูกต้องของตัวเลขหรือไม่ คุณอาจคิดว่าอัลกอริทึมเหล่านี้คือO (n)หรือO (sqrt (n))แต่นี่ไม่ใช่ความจริงด้วยเหตุผลดังต่อไปนี้: อินพุตของอัลกอริทึมของคุณคือตัวเลข: nโดยใช้สัญกรณ์ไบนารีขนาดอินพุตสำหรับ จำนวนเต็มnคือlog2 (n)จากนั้นทำการเปลี่ยนแปลงตัวแปร
m = log2(n) // your real input size
ให้หาจำนวนขั้นตอนเป็นฟังก์ชั่นของขนาดอินพุต
m = log2(n)
2^m = 2^log2(n) = n
ดังนั้นค่าใช้จ่ายของอัลกอริทึมของคุณในฐานะฟังก์ชันของขนาดอินพุตคือ:
T(m) = n steps = 2^m steps
และนี่คือเหตุผลที่ต้นทุนเป็นเลขชี้กำลัง