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


10

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

F(k)={bif k=0aif k=1F(k1)F(k2)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 ) = 3n4(n)=|F(n1)|(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(n1)|NF(n)ถูกคั่นด้วยอย่างน้อยเราจะเห็นว่าเวลาทำงานนั้นถูก จำกัด โดยคำสั่งของ n | F ( n ) | ( N|F(n1)| เนื่องจากความยาวของคำ Fibonacci เพิ่มขึ้นแบบทวีคูณn| F(n)| =O(N) คำที่เหลืออยู่คือnO(N)=O(NlogN)เนื่องจากผลรวมมีบันทึกNหลายคำ เราสรุปได้ว่าเวลาทำงานคือO(บันทึกN)

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN)logNO(NlogN).

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

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