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


10

给定两个符号和b,我们如下定义第k个斐波那契字符串:abk

F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)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的任何子字符串,对于a和b的适当选择,它也是Fibonacci字符串。SnSab

问题

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

一个简单的算法

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

NnP(n)F(n)∑n|P(n)||F(n)|n|F(n−1)|≤NF(n)|F(n−1)|

∑n|F(n)|(N|F(n−1)|+1).
∑n|F(n)|=O(N)∑nO(N)=O(Nlog⁡N)log⁡NO(Nlog⁡N)

FnΩ(|Fn|log⁡|Fn|)NΘ(Nlog⁡N)

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.