โดยทั่วไปแล้วคุณจะทราบได้อย่างไรว่ากรณีใดที่เลวร้ายที่สุดหรือดีที่สุดของคุณและกรณี "ขอบ" อื่น ๆ ที่คุณอาจมีก่อนที่จะมีและคุณจะเตรียมรหัสสำหรับพวกเขาได้อย่างไร
โดยทั่วไปแล้วคุณจะทราบได้อย่างไรว่ากรณีใดที่เลวร้ายที่สุดหรือดีที่สุดของคุณและกรณี "ขอบ" อื่น ๆ ที่คุณอาจมีก่อนที่จะมีและคุณจะเตรียมรหัสสำหรับพวกเขาได้อย่างไร
คำตอบ:
ขึ้นอยู่กับเนื้อหาของอัลกอริทึมคุณสามารถระบุโครงสร้างข้อมูล / ประเภท / โครงสร้างที่ใช้ จากนั้นคุณพยายามทำความเข้าใจจุดอ่อน (ที่เป็นไปได้) ของเหล่านั้นและลองคิดแผนการดำเนินการที่จะทำให้มันทำงานในกรณีเหล่านั้น
ตัวอย่างเช่นอัลกอริทึมรับสตริงและจำนวนเต็มเป็นอินพุตและทำการเรียงลำดับอักขระของสตริง
ที่นี่เรามี:
สตริงกับบางกรณีพิเศษที่รู้จัก:
จำนวนเต็มกับกรณีพิเศษที่รู้จัก:
จัดเรียงอัลกอริทึมที่อาจล้มเหลวในกรณีขอบเขตต่อไปนี้
จากนั้นใช้ทุกกรณีเหล่านี้และสร้างรายการยาว ๆ ที่พยายามเข้าใจว่าทับซ้อนกันอย่างไร Ex:
ตอนนี้สร้างกรณีทดสอบสำหรับพวกเขา :)
สรุปสั้น ๆ : ทำลายอัลกอริธึมในบล็อกพื้นฐานที่คุณรู้จักกรณีเขตแดนและประกอบเข้าด้วยกันอีกครั้งสร้างกรณีขอบเขตโลก
ฉันไม่คิดว่าจะมีอัลกอริทึมใด ๆ ในการกำหนดเงื่อนไขของขอบ
ตัวอย่าง: สำหรับพารามิเตอร์ byte คุณต้องการทดสอบหมายเลขเช่น 0, 127, 128, 255, 256, -1, ทุกสิ่งที่อาจทำให้เกิดปัญหา
"edge" มีความหมายสองประการและทั้งสองเกี่ยวข้องกันเมื่อพูดถึง case edge Edge เป็นพื้นที่ที่การเปลี่ยนแปลงเล็กน้อยในอินพุตนำไปสู่การเปลี่ยนแปลงขนาดใหญ่ในเอาต์พุตหรือจุดสิ้นสุดของช่วง
ดังนั้นเพื่อระบุกรณีขอบของอัลกอริทึมฉันแรกดูโดเมนอินพุต ค่าขอบอาจนำไปสู่กรณีขอบของอัลกอริทึม
ประการที่สองฉันดูโดเมนผลลัพธ์และมองย้อนกลับไปที่ค่าอินพุตที่อาจสร้างขึ้น นี่เป็นปัญหาที่เกิดขึ้นกับอัลกอริธึมน้อยกว่า แต่ช่วยค้นหาปัญหาในอัลกอริธึมที่ออกแบบมาเพื่อสร้างเอาต์พุตซึ่งครอบคลุมโดเมนเอาต์พุตที่กำหนด เช่นเครื่องกำเนิดเลขสุ่มควรจะสามารถสร้างค่าเอาต์พุตที่ต้องการได้ทั้งหมด
ในที่สุดฉันตรวจสอบอัลกอริทึมเพื่อดูว่ามีกรณีอินพุตที่คล้ายคลึงกันหรือไม่ แต่นำไปสู่ผลลัพธ์ที่แตกต่างกัน การค้นหาเคสขอบเหล่านี้เป็นสิ่งที่ยากที่สุดเนื่องจากเกี่ยวข้องกับทั้งสองโดเมนและอินพุตคู่
นี่เป็นคำถามที่ทั่วไปมากดังนั้นสิ่งที่ฉันทำได้คือทิ้งความคิดทั่วไปที่คลุมเครือ :)
-Examine กรณีขอบเขต อดีต หากคุณแยกวิเคราะห์สตริงจะเกิดอะไรขึ้นถ้าสตริงว่างเปล่าหรือว่างเปล่า? หากคุณนับจาก x ถึง y จะเกิดอะไรขึ้นที่ x และ y
- รหัสที่สามารถทำให้ง่ายขึ้นหรือ DRY-ed out ความซับซ้อนที่ไม่จำเป็นใด ๆ สามารถเพิ่มสิ่งที่ผิดพลาดได้
ส่วนหนึ่งของทักษะการใช้อัลกอริทึมคือการรู้ถึงจุดอ่อนและกรณีที่ทำให้เกิดโรค คำตอบของ Victor ให้คำแนะนำที่ดี แต่โดยทั่วไปฉันขอแนะนำให้คุณศึกษาหัวข้อในเชิงลึกเพื่อให้ได้ความรู้สึกนี้ฉันไม่คิดว่าคุณสามารถปฏิบัติตามกฎง่ายๆเพื่อตอบคำถามนี้ได้อย่างเต็มที่ เช่นดูCormenหรือSkiena (โดยเฉพาะ Skiena มีส่วนที่ดีมากในการใช้อัลกอริธึมและสิ่งใดที่ทำงานได้ดีในบางกรณี Cormen เข้าสู่ทฤษฎีมากกว่าที่ฉันคิดไว้)