เมื่อได้รับสองสัญลักษณ์และbให้นิยามสตริงk -th Fibonacci ดังนี้
ด้วย denoting string concatenation
ดังนั้นเราจะมี:
- ...
รับสตริงเกิดจากสัญลักษณ์nเรากำหนด substring Fibonacci เป็นsubstringของSซึ่งเป็นสตริง Fibonacci สำหรับตัวเลือกที่เหมาะสมของaและเหมาะสม
ปัญหา
รับเราต้องการหาสตริงย่อย Fibonacci ที่ยาวที่สุด
อัลกอริธึมเล็กน้อย
สำหรับแต่ละตำแหน่งของสตริงSสมมติว่าF ( 2 )เริ่มต้นที่นั่น (เพียงพอที่จะตรวจสอบว่าสัญลักษณ์i- th และ( i + 1 ) -th นั้นแตกต่างกัน) หากเป็นกรณีนี้ให้ตรวจสอบว่าสามารถขยายเป็นF ( 3 )จากนั้นกดF ( 4 )และอื่น ๆ หลังจากนั้นเริ่มต้นอีกครั้งจากตำแหน่งฉัน+ 1 ทำซ้ำจนกว่าจะถึงตำแหน่งn
เราต้องดูที่แต่ละสัญลักษณ์อย่างน้อยหนึ่งครั้งเพื่อให้มัน ) มีเพียงสองลูปเท่านั้นที่เกี่ยวข้องดังนั้นเราสามารถบอกได้อีกว่ามันเป็นO ( n 2 ) )
อย่างไรก็ตาม (ค่อนข้างแปลกใจ) อัลกอริธึมไร้เดียงสานี้ทำงานได้ดีกว่าอัลกอริธึมกำลังสองทั่วไป (ถ้ามันทำงานได้มากบนมากมันจะไม่ทำงานมากในตำแหน่งถัดไป)
ฉันจะใช้คุณสมบัติฟีโบนักชีเพื่อหาขอบเขตที่เข้มงวดมากขึ้นสำหรับเวลาดำเนินการของอัลกอริทึมนี้ได้อย่างไร