คุณระบุตัวพิมพ์“ edge” บนอัลกอริทึมได้อย่างไร


25

โดยทั่วไปแล้วคุณจะทราบได้อย่างไรว่ากรณีใดที่เลวร้ายที่สุดหรือดีที่สุดของคุณและกรณี "ขอบ" อื่น ๆ ที่คุณอาจมีก่อนที่จะมีและคุณจะเตรียมรหัสสำหรับพวกเขาได้อย่างไร


2
ทางเลือก: เมื่อเป็นไปได้ฉันเป็นแฟนตัวยงของการทดสอบฟัซซี่ มันเป็นเรื่องที่น่าประหลาดใจที่ข้อมูลอินพุตที่สร้างขึ้นแบบสุ่มจำนวนมากสามารถตรวจจับจุดบกพร่องภายในฟังก์ชั่นที่ไม่มีการตรวจสอบ / ทดสอบขอบอย่างเปิดเผย ทั้งสองทำงานร่วมกันได้ดีจริงๆ ... และพวกเขาเหล่านี้เป็นที่เห็นได้ชัดจากข้อผิดพลาดการเข้าสู่ระบบอย่างถูกต้องเมื่อทำงานโดยใช้ปัจจัยการผลิต "true" :)
Matthieu เมตร

คำตอบ:


28

ขึ้นอยู่กับเนื้อหาของอัลกอริทึมคุณสามารถระบุโครงสร้างข้อมูล / ประเภท / โครงสร้างที่ใช้ จากนั้นคุณพยายามทำความเข้าใจจุดอ่อน (ที่เป็นไปได้) ของเหล่านั้นและลองคิดแผนการดำเนินการที่จะทำให้มันทำงานในกรณีเหล่านั้น

ตัวอย่างเช่นอัลกอริทึมรับสตริงและจำนวนเต็มเป็นอินพุตและทำการเรียงลำดับอักขระของสตริง

ที่นี่เรามี:

สตริงกับบางกรณีพิเศษที่รู้จัก:

  • สตริงว่าง
  • สายยาว
  • สตริง Unicode (อักขระพิเศษ)
  • หาก จำกัด เฉพาะชุดอักขระจะเกิดอะไรขึ้นเมื่อตัวละครบางตัวไม่อยู่ในช่วง
  • สตริงความยาวคี่ / คู่
  • Null (เป็นอาร์กิวเมนต์)
  • ไม่ใช่ค่า null ที่ยกเลิก

จำนวนเต็มกับกรณีพิเศษที่รู้จัก:

  • 0
  • นาที / MAXINT
  • ลบ / เป็นบวก

จัดเรียงอัลกอริทึมที่อาจล้มเหลวในกรณีขอบเขตต่อไปนี้

  • อินพุตว่าง
  • อินพุต 1 องค์ประกอบ
  • อินพุตยาวมาก (อาจมีความยาวสูงสุด (ชนิดข้อมูลที่ใช้สำหรับดัชนี))
  • ขยะภายในคอลเลกชันที่จะถูกจัดเรียง
  • อินพุตว่าง
  • องค์ประกอบที่ซ้ำกัน
  • รวบรวมกับองค์ประกอบทั้งหมดเท่ากัน
  • อินพุตคี่ / คู่

จากนั้นใช้ทุกกรณีเหล่านี้และสร้างรายการยาว ๆ ที่พยายามเข้าใจว่าทับซ้อนกันอย่างไร Ex:

  • กรณีสตริงว่างเปล่าครอบคลุมกรณีรวบรวมว่าง
  • สตริง Null == คอลเลกชัน null
  • เป็นต้น

ตอนนี้สร้างกรณีทดสอบสำหรับพวกเขา :)

สรุปสั้น ๆ : ทำลายอัลกอริธึมในบล็อกพื้นฐานที่คุณรู้จักกรณีเขตแดนและประกอบเข้าด้วยกันอีกครั้งสร้างกรณีขอบเขตโลก


5
อีกหนึ่งสิ่งที่จะเพิ่ม . . วิเคราะห์รหัสและค้นหากรณีพิเศษในรหัส หากนักพัฒนาจัดการ 0 ถึง 13 แตกต่างจาก 14 และมากกว่า - บางที dev กำลังใช้อัลกอริทึมที่แตกต่างกันสำหรับค่าขนาดเล็กและขนาดใหญ่สำหรับเหตุผลด้านประสิทธิภาพ - คุณมีกรณีขอบที่ 13 และ 14 +1 สำหรับรายการที่ยอดเยี่ยม
Ethel Evans

2

ฉันไม่คิดว่าจะมีอัลกอริทึมใด ๆ ในการกำหนดเงื่อนไขของขอบ

ตัวอย่าง: สำหรับพารามิเตอร์ byte คุณต้องการทดสอบหมายเลขเช่น 0, 127, 128, 255, 256, -1, ทุกสิ่งที่อาจทำให้เกิดปัญหา


2

"edge" มีความหมายสองประการและทั้งสองเกี่ยวข้องกันเมื่อพูดถึง case edge Edge เป็นพื้นที่ที่การเปลี่ยนแปลงเล็กน้อยในอินพุตนำไปสู่การเปลี่ยนแปลงขนาดใหญ่ในเอาต์พุตหรือจุดสิ้นสุดของช่วง

ดังนั้นเพื่อระบุกรณีขอบของอัลกอริทึมฉันแรกดูโดเมนอินพุต ค่าขอบอาจนำไปสู่กรณีขอบของอัลกอริทึม

ประการที่สองฉันดูโดเมนผลลัพธ์และมองย้อนกลับไปที่ค่าอินพุตที่อาจสร้างขึ้น นี่เป็นปัญหาที่เกิดขึ้นกับอัลกอริธึมน้อยกว่า แต่ช่วยค้นหาปัญหาในอัลกอริธึมที่ออกแบบมาเพื่อสร้างเอาต์พุตซึ่งครอบคลุมโดเมนเอาต์พุตที่กำหนด เช่นเครื่องกำเนิดเลขสุ่มควรจะสามารถสร้างค่าเอาต์พุตที่ต้องการได้ทั้งหมด

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


0

นี่เป็นคำถามที่ทั่วไปมากดังนั้นสิ่งที่ฉันทำได้คือทิ้งความคิดทั่วไปที่คลุมเครือ :)

-Examine กรณีขอบเขต อดีต หากคุณแยกวิเคราะห์สตริงจะเกิดอะไรขึ้นถ้าสตริงว่างเปล่าหรือว่างเปล่า? หากคุณนับจาก x ถึง y จะเกิดอะไรขึ้นที่ x และ y
- รหัสที่สามารถทำให้ง่ายขึ้นหรือ DRY-ed out ความซับซ้อนที่ไม่จำเป็นใด ๆ สามารถเพิ่มสิ่งที่ผิดพลาดได้


0

ส่วนหนึ่งของทักษะการใช้อัลกอริทึมคือการรู้ถึงจุดอ่อนและกรณีที่ทำให้เกิดโรค คำตอบของ Victor ให้คำแนะนำที่ดี แต่โดยทั่วไปฉันขอแนะนำให้คุณศึกษาหัวข้อในเชิงลึกเพื่อให้ได้ความรู้สึกนี้ฉันไม่คิดว่าคุณสามารถปฏิบัติตามกฎง่ายๆเพื่อตอบคำถามนี้ได้อย่างเต็มที่ เช่นดูCormenหรือSkiena (โดยเฉพาะ Skiena มีส่วนที่ดีมากในการใช้อัลกอริธึมและสิ่งใดที่ทำงานได้ดีในบางกรณี Cormen เข้าสู่ทฤษฎีมากกว่าที่ฉันคิดไว้)

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