Cách rõ ràng để đi là lập trình động: hãy để lưu trữ hai chữ cái mà từ đó theo thứ tự Fibonacci bắt đầu ở vị trí và tính toán điều này bằng cách nhìn vào và . Điều này mất tối đa thời gian , vì chỉ có logarit nhiều giá trị có thể có của .i j F ( i - 2 , j ) F ( i - 1 , j + sợi ( i ) ) O ( n log n ) iF( tôi , j )ijF(i−2,j)F(i−1,j+fib(i))O(nlogn)i
Nhưng tôi nghi ngờ rằng chỉ có thể có các vị trí mà không trống (tức là khi có hai từ Fibonacci có cùng độ dài thì chúng chỉ có thể chồng chéo lên đến một phần không đổi chiều dài của chúng chứ không phải hầu hết chiều dài của chúng). Các vị trí không trống của là những vị trí duy nhất mà bạn cần thực hiện phép tính (thời gian không đổi) cho . Vì vậy, nếu sự nghi ngờ của tôi là đúng thì bạn có thể tăng tốc lên bằng cách theo dõi danh sách các vị trí không trống cho từng giá trị của và sử dụng danh sách cho để tăng tốc tính toán danh sách cho .F ( i - 2 , j ) F ( i - 2 , j ) F ( i , j ) O ( n ) i i - 2 iO(n/fib(i))F(i−2,j)F(i−2,j)F(i,j)O(n)ii−2i
Nếu bạn lưu trữ trong một mảng, không gian sẽ vẫn là ngay cả sau khi tăng tốc nhưng điều này có thể được cải thiện bằng cách sử dụng hàm băm thay thế. Hoặc, ngoài ra, bạn có thể lưu trữ trong một mảng được đóng gói bằng các từ -bit (sử dụng quan sát mà bạn chỉ cần biết liệu nó có trống hay không; bạn có thể tìm hai ký tự cho mỗi chuỗi con bằng cách tìm tại hai vị trí đầu tiên của nó trong chuỗi đầu vào).O ( n log n ) F O ( n ) log nFO(nlogn)FO(n) logn