เมื่อทำการทดสอบไอเท็ม n จะครอบคลุม t-subset ทั้งหมดให้น้อยที่สุดเท่าที่จะทำได้?


10

ปัญหานี้เกิดขึ้นจากการทดสอบซอฟต์แวร์ ปัญหาเป็นเรื่องยากที่จะอธิบาย ฉันจะให้ตัวอย่างก่อนจากนั้นพยายามสรุปปัญหา

มี 10 รายการที่จะทดสอบพูด A ถึง J และเครื่องมือทดสอบที่สามารถทดสอบ 3 รายการได้ในเวลาเดียวกัน ลำดับของรายการในเครื่องมือทดสอบไม่สำคัญ แน่นอนว่าสำหรับการทดสอบแบบละเอียดเราจำเป็นต้องมีรายการรวมกันเป็นรายการ10C3

ปัญหาซับซ้อนมากขึ้น มีเงื่อนไขเพิ่มเติมว่าเมื่อคู่ของรายการได้รับการทดสอบร่วมกันกว่าคู่เดียวกันไม่จำเป็นต้องมีการทดสอบอีกครั้ง

ตัวอย่างเช่นเมื่อเราดำเนินการทดสอบสามข้อต่อไปนี้:

เอบีซี

ADE

BDF

เราไม่จำเป็นต้องดำเนินการ:

ABD

เนื่องจากคู่ A, B ถูกครอบคลุมโดยกรณีทดสอบครั้งแรก A, D ถูกครอบคลุมโดยวินาทีและ B, D ถูกครอบด้วยอันดับที่สาม

ดังนั้นปัญหาคือจำนวนกรณีทดสอบขั้นต่ำที่เราต้องการเพื่อให้แน่ใจว่าทุกคู่ทดสอบ?

ในการพูดคุยทั่วไปหากเรามีรายการ n รายการ s สามารถทดสอบได้ในเวลาเดียวกันและเราต้องแน่ใจว่า tuples ที่เป็นไปได้ทั้งหมดได้รับการทดสอบ (เช่น s> t) จำนวนกรณีทดสอบขั้นต่ำที่เราต้องการคืออะไร เงื่อนไขของ n, s และ t?

และท้ายที่สุดสิ่งที่จะเป็นอัลกอริทึมที่ดีในการสร้างกรณีทดสอบที่จำเป็น?


1
กรณีที่ถูกทดสอบจะ "ดีที่สุด" (ทุก -tuple มีการทดสอบว่าครั้งเดียว) ถูกปกคลุมไปด้วยความคิดของบล็อกการออกแบบ มีความเป็นไปได้ในการทดสอบที่สมบูรณ์แบบค่อนข้างน้อยดังนั้นเราจึงจำเป็นต้องมีการวิเคราะห์พฤติกรรมเพิ่มเติม t
Hendrik Jan

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

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

@ wookie919 นั่นเป็นเพราะคุณไม่ได้ให้บริบท แต่ก่อปัญหาทั่วไป ฉันเพิ่งสังเกตเห็นว่าโดยทั่วไปคุณอาจต้องทดสอบชุดค่าผสมทั้งหมดที่สามารถเกิดขึ้นได้ (ขณะใช้งาน)
กราฟิลส์

คำตอบ:


11

บล็อกการออกแบบที่คุณต้องการ (สำหรับการทดสอบ 3 สิ่งที่เวลาและครอบคลุมทุกคู่) จะเรียกว่าสทิระบบสาม มีระบบ Steiner สามระบบพร้อมสามครั้งเมื่อ modและอัลกอริธึมเป็นที่รู้กันว่าจะสร้างสิ่งเหล่านี้ ดูตัวอย่างคำถาม MathOverflowนี้(พร้อมลิงค์ไปยัง Sage code ที่ใช้งานได้!) อื่น ๆคุณสามารถรอบขึ้นไปอีกสมัยและใช้การเปลี่ยนแปลงของระบบสามนี้สำหรับเพื่อให้ครอบคลุมทุกคู่สำหรับn13(n2)n1 or 36nn1 or 36nn

หากคุณต้องการสิ่งก่อสร้างที่ดีที่สุดสำหรับอื่น ๆจำนวน triples ที่ต้องการคือหมายเลขที่ครอบคลุมและได้รับจากรายการนี้ในสารานุกรมออนไลน์ของลำดับเลขจำนวนเต็ม ลิงก์นี้ไปยังพื้นที่เก็บข้อมูล La Jollaซึ่งมีพื้นที่เก็บข้อมูลที่ดี สารานุกรมออนไลน์ของลำดับเลขจำนวนเต็มให้สูตรที่คาดคะเนสำหรับ ; ถ้าสูตรนี้เก็บไว้โดยสังหรณ์นั่นหมายความว่าน่าจะมีวิธีอัลกอริธึมที่ดีในการสร้างสิ่งปกคลุมเหล่านี้ แต่เนื่องจากสูตรถูกคาดเดามันเป็นที่ชัดเจนว่าปัจจุบันไม่มีใครรู้จักพวกเขาn C(n,3,2)C(n,3,2)

สำหรับตัวเลขที่มีการครอบคลุมสูงการหุ้มที่ดีนั้นหายากกว่าสำหรับและที่เก็บจะให้คำตอบที่ดีกว่าอัลกอริธึมที่มีประสิทธิภาพที่รู้จักC(n,3,2)


5

จัดทำกราฟที่ไม่ได้บอกทิศทางซึ่งแต่ละจุดยอดเป็นคู่ของรายการและมีขอบระหว่างจุดยอดสองจุดหากพวกเขาแบ่งปันรายการร่วมกัน กล่าวอีกนัยหนึ่งโดยที่และ\} กราฟมีจุดยอดและจุดยอดทุกจุดจะมีขอบจุดเกิดขึ้นGG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1}(n2)2n4

แล้ววิธีการหนึ่งที่จะได้พบกับการจับคู่สูงสุดGอัลกอริทึมของ Edmond สามารถใช้เพื่อค้นหาการจับคู่สูงสุดในเวลาพหุนาม หากคุณโชคดีนี่จะให้การจับคู่ที่สมบูรณ์แบบแก่คุณและคุณก็เป็นคนดี แต่ละขอบในสอดคล้องตรงกันกับกรณีทดสอบเบื้องต้นเนื่องจากจุดสุดยอดทุกจุดเกิดขึ้นโดยมีขอบเดียวในการจับคู่ที่สมบูรณ์แบบคุณจึงครอบคลุมทุกคู่โดยใช้กรณีทดสอบซึ่งอยู่ในช่วงปัจจัยที่เหมาะสมที่สุด หากคุณไม่ได้รับการจับคู่ที่สมบูรณ์แบบเพิ่มกรณีทดสอบอีกสองสามกรณีตามที่จำเป็นเพื่อให้ได้ความครอบคลุมอย่างเต็มที่G({A,B},{B,C})EABC(n2)/21.5


4

ในกรณีของและคุณต้องทำการทดสอบอย่างน้อยเนื่องจากมีคู่และทุกการทดสอบครอบคลุม 3 คู่ นั่นหมายความว่าคุณสามารถทำสิ่งเล็ก ๆ น้อย ๆ และทำการทดสอบและเป็นเพียง 3 ปัจจัยที่เลวร้ายยิ่งกว่าสิ่งที่ดีที่สุดt = 2 ( ns=3t=2 ( n(n2)/3( n(n2)(n2)

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


สำหรับทั่วไปและมีขอบเขตที่ต่ำกว่าของการทดสอบ สำหรับขอบเขตบนฉันอ้างว่าเพียงพอที่จะสร้างการทดสอบt ( nst C ( n(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

เรามาดูกันว่าเกิดอะไรขึ้นเราเลือกการทดสอบแบบสุ่มอย่างสม่ำเสมอถ้าคุณเลือก -tupleโดยการสุ่มจากนั้นสำหรับการแก้ไข -tupleเรามีs}} ดังนั้นถ้าเราเลือกการทดสอบแบบสุ่มแล้วsS[n]tX[n]Pr[XS]=(ntst)(ns)C(nt)log((nt))

Pr[X does not belong to any of them]=(1(ntst)(ns))C(nt)log((nt))exp(C(ntst)(nt)(ns)(st)log((nt)))=exp(Clog(nt))1/(nt).

ดังนั้นโดยการรวมกันหลังจากการทดสอบแบบสุ่ม -tuples ทั้งหมดจะถูกครอบคลุมO(t(ntst)tlog(n))t


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