나는 오래된 체코 알고리즘 교과서에서 다음과 같은 문제를 겪었고 슬프게도 힌트 나 해결책이 없었습니다.
"피보나치 단어를 , , . 여기서 와 는 일반적인 문자입니다. 문자열 (잠재적으로 큰 알파벳 이상) 선형 시간에서 가장 긴 피보나치의 하위 단어를 찾을 수 있습니까? "
나는 이차 시간에 대한 해결책을 알고 있지만 그것을 선형으로 줄일 수는 없습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
나는 오래된 체코 알고리즘 교과서에서 다음과 같은 문제를 겪었고 슬프게도 힌트 나 해결책이 없었습니다.
"피보나치 단어를 , , . 여기서 와 는 일반적인 문자입니다. 문자열 (잠재적으로 큰 알파벳 이상) 선형 시간에서 가장 긴 피보나치의 하위 단어를 찾을 수 있습니까? "
나는 이차 시간에 대한 해결책을 알고 있지만 그것을 선형으로 줄일 수는 없습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
답변:
갈 수있는 확실한 방법은 동적 프로그래밍입니다 :하자 위해 어떤 피보나치 단어를 두 글자 저장 위치에서 시작 하고 보면이 계산 와 . 대수적으로 가능한 많은 값이 있기 때문에 최대 시간 이 걸립니다 .
그러나 가 비어 있지 않은 위치 만있을 수 있습니다 (예 : 길이가 같은 두 피보나치 단어가있을 때만 길이의 대부분이 아닌 길이의 일정한 비율까지 겹칩니다. 의 비어 있지 않은 위치 당신을 위해 (일정 시간) 계산을 할 필요가있는 유일한 사람입니다 . 내 의심에 해당하는 경우 그래서 당신은 그것을 속도를 수 의 각 값에 대해 비어 있지 않은 위치의 목록을 추적하여 와의 목록을 사용하여 에 대한 목록의 계산 속도를하는 .
배열에 를 저장 하면 속도 향상 후에도 공간은 여전히 이지만 해시 테이블을 사용하여 향상시킬 수 있습니다. 또는 를 비트 팩형 배열에 비트 단어로 저장할 수 있습니다 (비어 있는지 여부 만 알면됩니다). 각 하위 문자열에 대해 두 문자를 찾을 수 있습니다. 입력 문자열에서 처음 두 위치에서).