ความซับซ้อนของอัลกอริทึมที่ไร้เดียงสาในการค้นหาสตริงย่อย Fibonacci ที่ยาวที่สุด


10

เมื่อได้รับสองสัญลักษณ์และbให้นิยามสตริงk -th Fibonacci ดังนี้abk

F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else

ด้วย denoting string concatenation⋆

ดังนั้นเราจะมี:

  • 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เรากำหนด substring Fibonacci เป็นsubstringของSซึ่งเป็นสตริง Fibonacci สำหรับตัวเลือกที่เหมาะสมของaและSnSaเหมาะสมข

ปัญหา

รับเราต้องการหาสตริงย่อย Fibonacci ที่ยาวที่สุดS

อัลกอริธึมเล็กน้อย

สำหรับแต่ละตำแหน่งของสตริงSสมมติว่าF ( 2 )เริ่มต้นที่นั่น (เพียงพอที่จะตรวจสอบว่าสัญลักษณ์i- th และ( i + 1 ) -th นั้นแตกต่างกัน) หากเป็นกรณีนี้ให้ตรวจสอบว่าสามารถขยายเป็นF ( 3 )จากนั้นกดF ( 4 )และอื่น ๆ หลังจากนั้นเริ่มต้นอีกครั้งจากตำแหน่งฉัน+ 1 ทำซ้ำจนกว่าจะถึงตำแหน่งniSF(2)i(i+1)F(3)F(4)i+1n

เราต้องดูที่แต่ละสัญลักษณ์อย่างน้อยหนึ่งครั้งเพื่อให้มัน ) มีเพียงสองลูปเท่านั้นที่เกี่ยวข้องดังนั้นเราสามารถบอกได้อีกว่ามันเป็นO ( n 2 )Ω(n)O(n2) )

อย่างไรก็ตาม (ค่อนข้างแปลกใจ) อัลกอริธึมไร้เดียงสานี้ทำงานได้ดีกว่าอัลกอริธึมกำลังสองทั่วไป (ถ้ามันทำงานได้มากบนiมากมันจะไม่ทำงานมากในตำแหน่งถัดไป)

ฉันจะใช้คุณสมบัติฟีโบนักชีเพื่อหาขอบเขตที่เข้มงวดมากขึ้นสำหรับเวลาดำเนินการของอัลกอริทึมนี้ได้อย่างไร

คำตอบ:


5

สมมติว่าเกิดขึ้นในบางตำแหน่งถ้าซับสตริงเริ่มต้นที่ตำแหน่งนั้นเข้ากันได้กับF ( n )หรือการรวมเข้าด้วยกัน การเกิดF ( n )ใกล้เคียงกันมากแค่ไหน ใช้เป็นตัวอย่างF ( 4 ) = ขข หากF ( 4 )เกิดขึ้นที่ตำแหน่งpดังนั้นจะไม่สามารถเกิดขึ้นที่ตำแหน่งp + 1หรือp + 2F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2แต่ก็สามารถปรากฏที่ตำแหน่ง 3 เราปล่อยให้ℓ ( n )เป็นจำนวนที่เล็กที่สุดซึ่งการเกิดของF ( ℓ )สองครั้งสามารถเกิดขึ้นได้ที่ระยะทางp+3ℓ(n)F(ℓ)ℓ คุณสามารถพิสูจน์ได้ด้วยการเหนี่ยวนำว่าสำหรับ n ≥ 4เรามี ℓ ( n ) = | F ( n - 1 ) | (ตัวอย่างเช่น ℓ ( 4 ) = 3ℓn≥4ℓ(n)=|F(n−1)|ℓ(4)=3 )

ได้รับสตริงของความยาวสำหรับแต่ละnให้P ( n )เป็นชุดของตำแหน่งที่F ( n )ที่เกิดขึ้น เราสามารถ จำกัด เวลาทำงานของโพรซีเดอร์ของคุณได้อย่างคร่าวๆโดย∑ n | P ( n ) | | F ( n ) | ซึ่งผลรวมจะไหลไปเหนือnทั้งหมดเช่น| F ( n - 1 ) | ≤ N (พูด) ตั้งแต่เกิดF ( )NnP(n)F(n)∑n|P(n)||F(n)|n|F(n−1)|≤NF(n)ถูกคั่นด้วยอย่างน้อยเราจะเห็นว่าเวลาทำงานนั้นถูก จำกัด โดยคำสั่งของ ∑ n | F ( n ) | ( N|F(n−1)| เนื่องจากความยาวของคำ Fibonacci เพิ่มขึ้นแบบทวีคูณ∑n| F(n)| =O(N) คำที่เหลืออยู่คือ∑nO(N)=O(NlogN)เนื่องจากผลรวมมีบันทึกNหลายคำ เราสรุปได้ว่าเวลาทำงานคือO(บันทึกN)

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

ตรงกันข้ามเวลาทำงานบนคือΩ ( | F n |เข้าสู่ระบบ| F n | )ที่สามารถพิสูจน์โดยการเหนี่ยวนำ เราสรุปได้ว่ากรณีที่เลวร้ายที่สุดเวลาการทำงานในสายของความยาวNคือΘ ( N บันทึกN )FnΩ(|Fn|log⁡|Fn|)NΘ(Nlog⁡N)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.