Độ phức tạp của thuật toán ngây thơ trong việc tìm chuỗi con Fibonacci dài nhất


10

Cho hai ký hiệu b , hãy xác định chuỗi Fib- k thứ k như sau:abk

F(k)={bif k=0aif k=1F(k1)F(k2)else

với biểu thị chuỗi nối.

Do đó, chúng ta sẽ có:

  • F(0)=b
  • F(1)=a
  • F(2)=F(1)F(0)=ab
  • F(3)=F(2)F(1)=aba
  • F(4)=F(3)F(2)=abaab
  • ...

Với một chuỗi được hình thành bởi n ký hiệu, chúng tôi định nghĩa một chuỗi con Fibonacci là bất kỳ chuỗi con nào của S cũng là một chuỗi Fibonacci cho sự lựa chọn phù hợp của ab .SnSab

Vấn đề

Với , chúng tôi muốn tìm chuỗi con Fibonacci dài nhất của nó.S

Một thuật toán tầm thường

Đối với mỗi vị trí của chuỗi S , giả sử rằng F ( 2 ) bắt đầu từ đó (đủ để kiểm tra các ký hiệu thứ i( i + 1 ) có khác biệt không). Nếu đó là trường hợp, kiểm tra xem nó có thể được mở rộng đến F ( 3 ) , sau đó F ( 4 ) , v.v. Sau đó, bắt đầu lại từ vị trí i + 1 . Lặp lại cho đến khi bạn đạt đến vị trí n .iSF(2)i(i+1)F(3)F(4)i+1n

Chúng ta phải nhìn vào mỗi biểu tượng ít nhất một lần, vì vậy nó là . Chỉ có hai vòng lặp liên quan, vì vậy chúng ta có thể nói thêm rằng đó là O ( n 2 ) .Ω(n)O(n2)

Tuy nhiên (hơi ngạc nhiên) thuật toán ngây thơ này hoạt động tốt hơn nhiều so với thuật toán bậc hai thông thường (nếu nó hoạt động nhiều ở vị trí thứ , nó sẽ không làm được nhiều việc ở các vị trí tiếp theo).i

Làm cách nào tôi có thể sử dụng các thuộc tính Fibonacci để tìm giới hạn chặt hơn cho thời gian thực hiện của thuật toán này?

Câu trả lời:


5

F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(4)=3

NnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN)logNO(NlogN)

FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.