피보나치 단어


11

나는 오래된 체코 알고리즘 교과서에서 다음과 같은 문제를 겪었고 슬프게도 힌트 나 해결책이 없었습니다.

"피보나치 단어를 , , . 여기서 와 는 일반적인 문자입니다. 문자열 (잠재적으로 큰 알파벳 이상) 선형 시간에서 가장 긴 피보나치의 하위 단어를 찾을 수 있습니까? "F0=aF1=bFn+2=FnFn+1ab

나는 이차 시간에 대한 해결책을 알고 있지만 그것을 선형으로 줄일 수는 없습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?


3
이 오래된 체코 어 알고리즘 교과서의 이름은 무엇입니까? ;-)
Saeed

이 책에서 하위 단어가 연속적이어야합니까 (예 : 요인)?
Klaus Draeger

답변:


12

갈 수있는 확실한 방법은 동적 프로그래밍입니다 :하자 위해 어떤 피보나치 단어를 두 글자 저장 위치에서 시작 하고 보면이 계산 와 . 대수적으로 가능한 많은 값이 있기 때문에 최대 시간 이 걸립니다 .F(i,j)ijF(i2,j)F(i1,j+fib(i))O(nlogn)i

그러나 가 비어 있지 않은 위치 만있을 수 있습니다 (예 : 길이가 같은 두 피보나치 단어가있을 때만 길이의 대부분이 아닌 길이의 일정한 비율까지 겹칩니다. 의 비어 있지 않은 위치 당신을 위해 (일정 시간) 계산을 할 필요가있는 유일한 사람입니다 . 내 의심에 해당하는 경우 그래서 당신은 그것을 속도를 수 의 각 값에 대해 비어 있지 않은 위치의 목록을 추적하여 와의 목록을 사용하여 에 대한 목록의 계산 속도를하는 .O(n/fib(i))F(i2,j)F(i2,j)F(i,j)O(n)ii2i

배열에 를 저장 하면 속도 향상 후에도 공간은 여전히 이지만 해시 테이블을 사용하여 향상시킬 수 있습니다. 또는 를 비트 팩형 배열에 비트 단어로 저장할 수 있습니다 (비어 있는지 여부 만 알면됩니다). 각 하위 문자열에 대해 두 문자를 찾을 수 있습니다. 입력 문자열에서 처음 두 위치에서).FO(nlogn)FO(n) logn


동적 프로그래밍 이이 문제에 가장 적합한 방법 이라고 생각한 이유 는 무엇입니까? C 와 같은 정적 프로그래밍을 사용하면 문제가 발생하는 곳은 어디 입니까?
tarit goswami

1
동적 프로그래밍은 프로그래밍 언어 클래스가 아닌 알고리즘 설계 기술입니다.
David Eppstein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.