ให้นำชุดฟีโบนักชีเป็นตัวอย่าง
1,1,2,3,5,8,13,21....
first number: 1
Second number: 1
Third Number: 2
อีกวิธีที่จะนำมัน
Bottom(first) number: 1
Top (Eighth) number on the given sequence: 21
ในกรณีที่มีหมายเลขฟีโบนักชีห้าหมายเลขแรก
Bottom(first) number :1
Top (fifth) number: 5
ตอนนี้ลองมาดูตัวอย่างอัลกอริทึม Fibonacci ซีรีย์ซ้ำ
public int rcursive(int n) {
if ((n == 1) || (n == 2)) {
return 1;
} else {
return rcursive(n - 1) + rcursive(n - 2);
}
}
ตอนนี้ถ้าเรารันโปรแกรมนี้ด้วยคำสั่งดังต่อไปนี้
rcursive(5);
หากเราพิจารณาอัลกอริธึมอย่างใกล้ชิดเพื่อสร้างหมายเลขที่ห้าต้องใช้หมายเลขที่ 3 และ 4 ดังนั้นการสอบถามซ้ำของฉันจึงเริ่มต้นจากด้านบน (5) จากนั้นไปจนถึงตัวเลขด้านล่าง / ล่าง วิธีนี้เป็นวิธีการจากบนลงล่างจริงๆ
เพื่อหลีกเลี่ยงการคำนวณเดียวกันหลายครั้งเราใช้เทคนิคการเขียนโปรแกรมแบบไดนามิก เราเก็บค่าที่คำนวณไว้ก่อนหน้านี้และนำมาใช้ซ้ำ เทคนิคนี้เรียกว่าการจำ มีมากกว่าการเขียนโปรแกรมแบบไดนามิกอื่น ๆ แล้วการบันทึกความจำซึ่งไม่จำเป็นเพื่อหารือเกี่ยวกับปัญหาปัจจุบัน
จากบนลงล่าง
ให้เขียนอัลกอริทึมดั้งเดิมของเราใหม่และเพิ่มเทคนิคที่จำได้
public int memoized(int n, int[] memo) {
if (n <= 2) {
return 1;
} else if (memo[n] != -1) {
return memo[n];
} else {
memo[n] = memoized(n - 1, memo) + memoized(n - 2, memo);
}
return memo[n];
}
และเราดำเนินการวิธีการดังต่อไปนี้
int n = 5;
int[] memo = new int[n + 1];
Arrays.fill(memo, -1);
memoized(n, memo);
วิธีการแก้ปัญหานี้ยังคงจากบนลงล่างเนื่องจากอัลกอริทึมเริ่มต้นจากค่าสูงสุดและไปด้านล่างในแต่ละขั้นตอนเพื่อรับค่าสูงสุดของเรา
จากล่างขึ้นบน
แต่คำถามคือเราจะเริ่มจากด้านล่างได้ไหมจากหมายเลขแรกของฟีโบนักชีแล้วเดินไปจนถึงจุดสูงสุด ให้เขียนใหม่โดยใช้เทคนิคนี้
public int dp(int n) {
int[] output = new int[n + 1];
output[1] = 1;
output[2] = 1;
for (int i = 3; i <= n; i++) {
output[i] = output[i - 1] + output[i - 2];
}
return output[n];
}
ทีนี้ถ้าเราดูอัลกอริธึมนี้จริง ๆ แล้วเริ่มจากค่าต่ำลง ถ้าฉันต้องการหมายเลขฟีโบนักชีอันดับที่ 5 ฉันกำลังคำนวณหาอันดับที่ 1 จริง ๆ จากนั้นก็จะเป็นอันดับสองและอันดับสามจนถึงอันดับที่ 5 เทคนิคนี้เรียกว่าเทคนิคจากล่างขึ้นบน
สองขั้นตอนสุดท้ายขั้นตอนวิธีการเขียนโปรแกรมแบบไดนามิกเต็มความต้องการ แต่อีกอันคือจากบนลงล่างและอีกอันคือจากล่างขึ้นบน อัลกอริทึมทั้งสองมีความซับซ้อนของพื้นที่และเวลาที่คล้ายกัน