Як перевіряти n елементів, як охопити всі т-підмножини якомога менше s-підмножин?


10

Ця проблема виникла при тестуванні програмного забезпечення. Проблему трохи важко пояснити. Спершу наведу приклад, потім спробую узагальнити проблему.

Є 10 предметів, які підлягають тестуванню, наприклад, від A до J, і інструмент для тестування, який може протестувати 3 предмети одночасно. Порядок елементів у інструменті тестування не має значення. Звичайно, для вичерпного тестування нам потрібні комбінації елементів.10C3

Проблема складніша. Існує додаткова умова, що після того, як пара предметів була протестована разом, то ж цю пару не потрібно перевіряти знову.

Наприклад, щойно ми виконали наступні три тести:

ABC

ADE

BDF

нам не потрібно виконувати:

ABD

оскільки пара A, B була охоплена першим випробувальним випадком, A, D була охоплена другою, а B, D була охоплена третьою.

Отже, проблема полягає в тому, яка мінімальна кількість тестових випадків нам потрібна для того, щоб перевірити всі пари?

Для узагальнення, якщо у нас є n елементів, s можна перевірити одночасно, і нам потрібно забезпечити тестування всіх можливих t кортежів (таких, що s> t), яка мінімальна кількість тестових випадків, які нам потрібні умови n, s і t?

І нарешті, який би був хороший алгоритм для створення необхідних тестових випадків?


1
Випадки, коли тест є "оптимальним" (кожний пар перевіряється рівно один раз), охоплені поняттям Block Design . Ці ідеальні можливості тестування порівняно небагато, тому потрібна додаткова евристика. t
Гендрик Ян

Ваша парадигма тесту несправна; це може бути недостатньо для тестування лише пар. Деякі помилки можуть виникнути лише в тому випадку, якщо три (або більше) компонентів діють разом у певній комбінації.
Рафаель

4
@Raphael, дякую за набагато кращий заголовок, але я абсолютно не розумію, як ви можете стверджувати, що "ваша тестова парадигма несправна", якщо я не розумію фактичної проблеми чи контексту.
wookie919

@ wookie919 Це тому, що ви не даєте жодного контексту, але створюєте загальну проблему. Я просто зауважив, що, як правило, вам може знадобитися перевірити всі комбінації, які можуть відбуватися (в дії).
Рафаель

Відповіді:


11

Блокові конструкції, які ви хочете (для тестування 3 речей одночасно та охоплення всіх пар) називаються потрійними системами Steiner . Існує потрійна система Штайнера з трійки всякий раз, коли mod , і алгоритми, як відомо, будують їх. Дивіться, наприклад, це запитання про MathOverflow (із посиланням на робочий код Sage!). Для інших , ви можете округлити до наступного mod і використовувати модифікацію цієї потрійної системи для щоб охопити всі пари для .13(n2)n1 or 36nn1 or 36nn

Якщо ви хочете найкращої побудови для інших , кількість необхідних трійки - це число, що охоплює , і задається цим записом в он-лайн енциклопедії цілих послідовностей. Це посилання на сховище La Jolla Covering, яке має сховище хороших покриттів. Інтернет-енциклопедія цілих послідовностей дає видуману формулу для ; якщо ця формула дотримується, інтуїтивно це означає, що, ймовірно, повинні існувати хороші алгоритмічні способи побудови цих покриттів, але оскільки формула продумана, зрозуміло, що наразі ніхто їх не знає.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({A,B},{B,C})EABC(n2)/21.5


4

У випадку і вам потрібно виконати принаймні тестів, оскільки є пар, і кожен тест охоплює 3 пари. Це означає, що ви можете робити банальну справу і виконувати тести , і бути лише на 3 рази гіршим від оптимального.t = 2 ( ns=3t=2 ( n(n2)/3( н(n2)(n2)

Якщо ви насправді це програмуєте, то способом оптимізувати це можна, спершу вибравши кілька випадків тестів на номер, а потім виконайте грубу силу на парах, які поки не охоплені тестом.


Для загальних та існує нижня межа тестів . Для верхньої межі я стверджую, що цього достатньо, щоб зробити тести.t ( nst C ( n(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

Подивимося, що відбувається, ми вибираємо тести навмання рівномірно. Якщо ви вибрали випадково -tuple , тоді для фіксованого -tuple нас є . Отже, якщо ми виберемо тести випадково, то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).

Таким чином, зв'язаним об'єднанням, після випадкові тести будуть охоплені всі парні.O(t(ntst)tlog(n))t


Дякую вам за дуже проникливу відповідь, але я шукав точний алгоритм, який би генерував саме нижню межу тестових випадків (якщо це можливо) або щось дуже близьке до нижня межа. (nt)/s
wookie919
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.