เมื่อพูดถึงการออกแบบอัลกอริธึมมักใช้เทคนิคต่อไปนี้:
- การเขียนโปรแกรมแบบไดนามิก
- กลยุทธ์โลภ
- แบ่งและพิชิต
ในขณะที่วิธีการสองวิธีแรกมีรากฐานทางทฤษฎีที่รู้จักกันดีคือหลักการของ Bellman Optimality และ matroid (resp. greedoid) ทฤษฎีฉันไม่สามารถหากรอบทั่วไปสำหรับอัลกอริธึมตาม D&C
ประการแรกฉันตระหนักถึงบางสิ่งบางอย่างที่เรา (หรือมากกว่าผู้เชี่ยวชาญ) ที่แนะนำในคลาสการเขียนโปรแกรมใช้งานได้เรียกว่า "โครงกระดูกอัลกอริทึม" ที่เกิดขึ้นในบริบทของ combinators ตัวอย่างของที่นี่เราให้โครงกระดูกดังกล่าวสำหรับอัลกอริธึม D&C ดังนี้:
คำนิยาม : ปล่อยให้เป็นเซตที่ไม่ว่างเปล่า เราเรียกองค์ประกอบของโซลูชั่นและองค์ประกอบของ (นั่นคือส่วนย่อยของ) จะเรียกว่าเป็นปัญหา จากนั้นD & C- โครงกระดูกคือ tuple 4โดยที่:S A
- เป็นกริยามากกว่าชุดของปัญหาและเราบอกว่าปัญหาที่เกิดขึ้นเป็นพื้นฐาน IFFถือ
- เป็นการแมปที่กำหนดวิธีแก้ปัญหาสำหรับปัญหาพื้นฐานแต่ละข้อ
- คือการแมป ที่แบ่งแต่ละปัญหาออกเป็นชุดย่อยของปัญหา
- คือการทำแผนที่ที่เข้าร่วมการแก้ปัญหา (ขึ้นอยู่กับชนิดของ "ปัญหาการหมุน") ของปัญหาย่อยเพื่อสร้างทางออก
จากนั้นสำหรับโครงกระดูกและปัญหาฟังก์ชันทั่วไปต่อไปนี้คำนวณวิธีแก้ปัญหา (ในรูปแบบเป็นทางการ ความรู้สึก) สำหรับ :p f s : P → S p
ที่ในบรรทัดที่สองเราจะใช้สัญกรณ์สำหรับย่อยของโคโดเมนของการทำแผนที่ฉX f
อย่างไรก็ตามเราไม่ได้ตรวจสอบคุณสมบัติพื้นฐาน "โครงสร้าง" ของปัญหาที่สามารถกำหนดได้ด้วยวิธีนี้ (ดังที่ฉันบอกว่ามันเป็นคลาสการเขียนโปรแกรมที่ใช้งานได้และนี่เป็นเพียงตัวอย่างเล็ก ๆ ) น่าเสียดายที่ฉันไม่สามารถหาข้อมูลอ้างอิงเพิ่มเติมเกี่ยวกับวิธีการนี้ได้ ดังนั้นฉันไม่คิดว่าคำจำกัดความข้างต้นค่อนข้างมาตรฐาน หากมีคนรับรู้สิ่งที่ฉันได้กล่าวไว้ข้างต้นฉันจะดีใจที่บทความที่เกี่ยวข้อง
ประการที่สองสำหรับกลยุทธ์โลภที่เรามีผลลัพธ์ที่มีชื่อเสียงว่าปัญหาได้รับการแก้ไขอย่างถูกต้องโดยอัลกอริทึมโลภทั่วไปถ้าหากวิธีการแก้ปัญหาของมันเป็น matroid ถ่วงน้ำหนัก มีผลลัพธ์ที่คล้ายกันสำหรับ D & C- อัลกอริทึม (ไม่จำเป็นต้องขึ้นอยู่กับวิธีการที่อธิบายไว้ข้างต้น)?