Я ищу алгоритм для решения следующей проблемы, которую я (пока) называю алгоритмом «плохого яблока».
Проблема
- У меня N процессов, запущенных в M песочницах, где N >> M.
- Непрактично давать каждому процессу свою собственную песочницу.
- По крайней мере, один из этих процессов ведет себя плохо и разрушает всю изолированную программную среду, тем самым убивая все остальные процессы в этой же изолированной программной среде.
Если бы это был один процесс с плохим поведением, то я мог бы использовать простое деление пополам, чтобы поместить половину процессов в одну песочницу, а половину - в другую, пока не обнаружу негодяй.
Вопрос
Если несколько процессов плохо себя ведут, включая вероятность того, что все они плохо себя ведут, «работает» ли этот наивный алгоритм? Гарантируется ли работа в разумных пределах?
Упрощения
Ради аргумента давайте предположим, что плохой процесс мгновенно разрушает свою песочницу, а хороший процесс никогда не делает.
algorithms
Роджер Липскомб
источник
источник
Ответы:
Если вы нашли одно плохое яблоко, вы можете применить алгоритм:
Аналогично, если вы находили одно «хорошее» яблоко, то применялся тот же алгоритм, но скорее находил хорошую группу.
Этот алгоритм имеет производительность O (log_M (N)), но это зависит от того факта, что существует только одно плохое яблоко.
Если вы не знаете, сколько хороших / плохих яблок, то вы можете использовать следующий алгоритм:
Это худший сценарий, но он выполняется во
O(N/M)
времени (или вO(N)
зависимости от того, считаете ли вы один проход одним тестом или набором тестов, выполняемых параллельно). Учитывая все обстоятельства, это не плохой подход с любой стороны.Могут быть алгоритмы, которые работают лучше, чем это, но это требует, чтобы вы знали, сколько плохих яблок / хороших яблок в партии. Не зная этого фактора, хотя я не могу доказать это, я готов поспорить, что вы не можете добиться большего успеха, чем последний алгоритм, перечисленный выше.
Надеюсь, это поможет!
Изменить : С практической точки зрения, я понимаю, что некоторые из этих операций не так легко выполнить. Это правда, однако, к сожалению, реальность такова, что вы не можете точно определить «плохое яблоко», исходя из того, какие процессы выполнялись в «песочнице», которая работала в тот момент, без необходимости по крайней мере активировать или деактивировать процессы. Если вопрос относится к алгоритму, я думаю, что я ответил на это. Если вопрос относится к тому, как справиться с такой ситуацией, то, возможно, этот вопрос лучше подойдет для суперпользователя SE.
источник