가장 긴 피보나치 부분 문자열을 찾기위한 순진한 알고리즘의 복잡성


10

두 개의 기호 b가 주어지면 k 번째 피보나치 문자열을 다음과 같이 정의합시다 .abk

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

문자열 연결을 나타내는.

따라서 우리는 :

  • 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
  • ...

문자열이 주어 에 의해 형성된 n 개의 심볼, 우리는 모든 피보나치 서브 스트링으로 정의 문자열S 도의 적절한 선택을위한 피보나치 문자열 및 B .SnSab

문제

주어지면 가장 긴 피보나치 부분 문자열을 찾고 싶습니다.S

사소한 알고리즘

문자열 S 의 각 위치 에 대해 F ( 2 ) 가 시작 한다고 가정합니다 ( i 번째 및 ( i + 1 ) 번째 기호가 고유한지 확인하기에 충분합니다 ). 이 경우 F ( 3 ) 으로 확장 한 다음 F ( 4 ) 등 으로 확장 할 수 있는지 확인하십시오 . 그런 다음 i + 1 위치에서 다시 시작하십시오 . 위치 n에 도달 할 때까지 반복하십시오 .iSF(2)i(i+1)F(3)F(4)i+1n

Ω(n)O(n2)

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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.