查找最长斐波那契子串的幼稚算法的复杂性


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个符号形成的字符串,我们将Fibonacci子字符串定义为S的任何子字符串,对于ab的适当选择,它也是Fibonacci字符串。SnSab

问题

给定,我们想找到其最长的斐波那契子串。S

一个简单的算法

对于字符串S的每个位置,假设F 2 从此处开始(检查第i个和第i + 1 个符号是否足够就足够了)。如果是这样,请检查它是否可以扩展为F 3 ,然后扩展为F 4 ,依此类推。在此之后,从位置重新开始+ 1。重复直到到达位置niSF(2)i(i+1)F(3)F(4)i+1n

我们必须至少一次查看每个符号,所以它是。仅涉及两个for循环,因此我们可以说它是O n 2Ω(n)O(n2)

但是,(很奇怪的是)这种天真的算法比通常的二次算法要好得多(如果它在第个位置上做很多工作,那么在下一个位置上就不会做很多工作)。i

如何使用斐波那契属性为该算法的执行时间找到更严格的界限?

Answers:


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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.