Từ ngữ


11

Tôi đã gặp vấn đề sau trong sách giáo khoa thuật toán tiếng Séc cũ của tôi, thật đáng buồn là không có gợi ý hay giải pháp nào.

"Chúng tôi xác định các từ Fibonacci là , , , trong đó và là các chữ cái chung. chuỗi (trên một bảng chữ cái có khả năng lớn) bạn có thể tìm thấy từ phụ dài nhất của Fibonacci trong thời gian tuyến tính không? "F 1 = b F n + 2 = F n F n + 1 a bF0=aF1=bFn+2=FnFn+1ab

Tôi biết một giải pháp trong thời gian bậc hai, nhưng không thể giảm nó thành tuyến tính. Bất cứ ai có thể chỉ cho tôi đi đúng hướng?


3
Tên của sách giáo khoa thuật toán Séc cũ này là gì ;-)
Saeed

Các từ phụ có bắt buộc phải liền kề (nghĩa là các yếu tố) trong cuốn sách này không?
Klaus Draeger

Câu trả lời:


12

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(i,j)ijF(i2,j)F(i1,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(i2,j)F(i2,j)F(i,j)O(n)ii2i

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


Bạn có thể cho tôi biết, tại sao bạn nghĩ rằng lập trình động sẽ là lựa chọn tốt nhất cho vấn đề này? Chúng ta sẽ gặp vấn đề ở đâu nếu sử dụng bất kỳ chương trình tĩnh nào như C ?
tarit goswami

1
Lập trình động là một kỹ thuật thiết kế thuật toán, không phải là một lớp ngôn ngữ lập trình.
David Eppstein
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.