Khi kiểm tra n mục, làm thế nào để bao gồm tất cả các tập con t bằng càng ít tập con càng tốt?


10

Vấn đề này phát sinh từ kiểm thử phần mềm. Vấn đề là một chút khó khăn để giải thích. Trước tiên tôi sẽ đưa ra một ví dụ, sau đó cố gắng khái quát hóa vấn đề.

Có 10 mục cần kiểm tra, từ A đến J và một công cụ kiểm tra có thể kiểm tra 3 mục cùng một lúc. Thứ tự của các mục trong công cụ kiểm tra không quan trọng. Tất nhiên, để thử nghiệm toàn diện, chúng tôi cần 10 C 3 kết hợp các mặt hàng.10C3

Vấn đề phức tạp hơn. Có một điều kiện bổ sung rằng một khi một cặp vật phẩm đã được thử nghiệm cùng nhau, thì cùng một cặp không cần phải kiểm tra lại.

Ví dụ: một khi chúng tôi thực hiện ba thử nghiệm sau:

ABC

QUẢNG CÁO

BDF

chúng tôi không phải thực hiện:

ABD

bởi vì cặp A, B được bao phủ bởi trường hợp thử nghiệm đầu tiên, A, D được bao phủ bởi cái thứ hai và B, D được bao phủ bởi cái thứ ba.

Vì vậy, vấn đề là, số lượng tối thiểu các trường hợp thử nghiệm mà chúng ta cần để đảm bảo rằng tất cả các cặp được kiểm tra là gì?

Để khái quát hóa, nếu chúng ta có n mục, s có thể được kiểm tra cùng một lúc và chúng ta cần đảm bảo rằng tất cả các tuple có thể được kiểm tra (chẳng hạn như s> t), số lượng trường hợp thử nghiệm tối thiểu mà chúng ta cần trong điều khoản của n, s và t?

Và cuối cùng, điều gì sẽ là một thuật toán tốt để tạo ra các trường hợp thử nghiệm cần thiết?


1
Các trường hợp thử nghiệm là "tối ưu" (mọi tuple được kiểm tra chính xác một lần) được bao phủ bởi khái niệm Thiết kế khối . Có tương đối ít trong số các khả năng kiểm tra hoàn hảo này, vì vậy người ta cần thêm các phương pháp phỏng đoán, tôi đoán vậy. t
Hendrik ngày

Mô hình thử nghiệm của bạn bị lỗi; nó có thể không đủ để chỉ kiểm tra các cặp. Một số lỗi chỉ có thể xảy ra nếu ba (hoặc nhiều) thành phần hoạt động cùng nhau trong một kết hợp cụ thể.
Raphael

4
@Raphael, cảm ơn vì một tiêu đề tốt hơn nhiều, nhưng tôi hoàn toàn không hiểu làm thế nào bạn có thể tuyên bố "mô hình thử nghiệm của bạn bị lỗi" khi không hiểu gì về vấn đề thực tế hoặc bối cảnh.
wookie919

@ wookie919 Đó là vì bạn không đưa ra bất kỳ bối cảnh nào mà đặt ra một vấn đề chung . Tôi chỉ đơn thuần quan sát thấy rằng, nói chung, bạn có thể cần phải kiểm tra tất cả các kết hợp có thể xảy ra (trong hành động).
Raphael

Câu trả lời:


11

Các thiết kế khối bạn muốn (để thử nghiệm 3 thứ cùng một lúc và bao gồm tất cả các cặp) được gọi là hệ thống ba Steiner . Tồn tại một hệ thống ba Steiner với ba lần bất cứ khi nào mod và các thuật toán được biết để xây dựng các thuật toán này. Xem, ví dụ, câu hỏi MathOverflow này (có liên kết đến mã Sage hoạt động!). Đối với khác , bạn có thể làm tròn đến mod và sử dụng sửa đổi hệ thống ba này cho để bao gồm tất cả các cặp cho . n1or36nn'1or36n'n13(n2)n1 or 36nn1 or 36nn

Nếu bạn muốn xây dựng tốt nhất cho khác , số lượng bộ ba cần thiết là số bao gồm và được đưa ra bởi mục này trong bách khoa toàn thư trực tuyến về chuỗi số nguyên. Liên kết này đến Kho lưu trữ La Jolla có kho lưu trữ các lớp phủ tốt. Từ điển bách khoa trực tuyến về các chuỗi số nguyên đưa ra một công thức được phỏng đoán cho ; Nếu công thức này nắm giữ, theo trực giác có nghĩa là có lẽ nên có những cách thức tốt để xây dựng các lớp phủ này, nhưng vì công thức được phỏng đoán, rõ ràng là hiện tại không ai biết chúng.C ( n , 3 , 2 ) C ( n , 3 , 2 )n C(n,3,2)C(n,3,2)

Đối với số có độ che phủ cao, lớp phủ tốt khó tìm hơn so với và kho lưu trữ sẽ cung cấp giải pháp tốt hơn bất kỳ thuật toán hiệu quả đã biết nào.C(n,3,2)


5

Tạo thành đồ thị vô hướng trong đó mỗi đỉnh là một cặp vật phẩm và ở đó có một cạnh giữa hai đỉnh nếu chúng có chung một vật phẩm. Nói cách khác, trong đó và . Biểu đồ có các đỉnh và mỗi đỉnh có cạnh trên đó.G = ( V , E ) V = { { một , b } : một , b Items một b } E = { ( s , t ) : s , t V | s t | = 1 } ( nGG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1} 2n-4(n2)2n4

Sau đó, một cách tiếp cận sẽ được để tìm một kết hợp tối đa trong . Thuật toán của Edmonds có thể được sử dụng để tìm ra sự trùng khớp tối đa như vậy trong thời gian đa thức. Nếu bạn may mắn, điều này sẽ cung cấp cho bạn một kết hợp hoàn hảo, và sau đó bạn tốt. Mỗi cạnh trong khớp tương ứng với trường hợp kiểm tra . Vì mỗi đỉnh là sự cố với một cạnh trong kết hợp hoàn hảo, bạn đã bao gồm tất cả các cặp, sử dụng trường hợp thử nghiệm, trong phạm vi yếu tố tối ưu. Nếu bạn không có được một kết hợp hoàn hảo, hãy thêm một vài trường hợp thử nghiệm nếu cần để đạt được phạm vi bảo hiểm đầy đủ.( { A , B } , { B , C } ) E A B C ( nG({A,B},{B,C})EABC1,5(n2)/21.5


4

Trong trường hợp và bạn cần thực hiện ít nhất bài kiểm tra, vì có cặp và mỗi bài kiểm tra bao gồm 3 cặp. Điều đó có nghĩa là bạn có thể thực hiện những việc nhỏ nhặt và thực hiện các bài kiểm tra và chỉ là yếu tố 3 kém hơn mức tối ưu.t = 2 ( ns=3t=2 ( n(n2)/3( n(n2)(n2)

Nếu bạn thực sự đang lập trình điều này, thì một cách để tối ưu hóa điều này có thể là bằng cách trước tiên chọn một số bài kiểm tra số một cách ngẫu nhiên, và sau đó thực hiện lực lượng vũ phu đối với các cặp không được bao phủ trong bài kiểm tra cho đến nay.


Đối với và , có giới hạn dưới của các phép thử . Đối với giới hạn trên tôi cho rằng điều đó là đủ để tạo kiểm tra.t ( nst C ( n(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

Chúng ta hãy xem điều gì xảy ra, chúng tôi chọn các thử nghiệm một cách ngẫu nhiên. Nếu bạn chọn một -tuple một cách ngẫu nhiên, thì đối với một -tuple cố định , chúng tôi có . Do đó, nếu chúng tôi chọn các bài kiểm tra , thìS [ n ] t X [ n ] Pr [ X S ] = ( n - tsS[n]tX[n] C(nPr[XS]=(ntst)(ns)Pr[X không thuộc về bất kỳ ai trong số họ]=(1- ( n - tC(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).

Do đó, bằng sự kết hợp ràng buộc, sau khi kiểm tra ngẫu nhiên tất cả -tuples sẽ được bảo hiểm.tO(t(ntst)tlog(n))t


Cảm ơn bạn rất nhiều vì câu trả lời rất sâu sắc, nhưng tôi đã tìm kiếm một thuật toán chính xác sẽ tạo ra chính xác số lượng các trường hợp kiểm tra giới hạn thấp hơn (nếu điều đó thậm chí có thể) hoặc một cái gì đó rất gần với giới hạn dưới. (nt)/s
wookie919
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.