Je cherche un algorithme pour gérer le problème suivant, que j'appelle (pour l'instant) l'algorithme "bad apple".
Le problème
- J'ai N processus en cours d'exécution dans M bacs à sable, où N >> M.
- Il est impossible de donner à chaque processus son propre bac à sable.
- Au moins un de ces processus se comporte mal et fait tomber l'ensemble du bac à sable, tuant ainsi tous les autres processus dans le même bac à sable.
S'il s'agissait d'un seul processus mal comporté, je pourrais utiliser une simple bissection pour mettre la moitié des processus dans un bac à sable et l'autre moitié dans un autre bac à sable, jusqu'à ce que je trouve le mécréant.
La question
Si plusieurs processus se comportent mal - y compris la possibilité qu'ils soient tous mal comportés - cet algorithme naïf "fonctionne"? Est-il garanti de fonctionner dans des limites raisonnables?
Simplifications
Par souci d'argument, supposons qu'un mauvais processus fait tomber son bac à sable instantanément, et qu'un bon processus ne le fait jamais.
algorithms
Roger Lipscombe
la source
la source
Réponses:
Si vous trouviez une mauvaise pomme, vous pouvez appliquer l'algorithme:
De même, si vous trouviez la seule "bonne" pomme, le même algorithme s'applique, mais plutôt le bon groupe.
Cet algorithme a un taux de performance O (log_M (N)) mais cela dépend du fait qu'il n'y a qu'une seule mauvaise pomme.
Si vous ne savez pas combien il y a de bonnes / mauvaises pommes, vous pouvez utiliser l'algorithme suivant:
C'est le pire des cas, mais il s'exécute dans le
O(N/M)
temps (ouO(N)
selon que vous considérez une seule passe comme un seul test ou comme un ensemble de tests effectués en parallèle). Tout bien considéré, ce n'est en aucun cas une mauvaise approche.Il peut y avoir des algorithmes qui fonctionnent mieux que cela, mais cela nécessite que vous sachiez combien de mauvaises pommes / bonnes pommes il y a dans le lot. Ne connaissant pas ce facteur, bien que je ne puisse pas le prouver, je serais prêt à parier que vous ne pouvez pas faire mieux que le dernier algorithme répertorié ci-dessus.
J'espère que cela pourra aider!
Edit : D'un point de vue pratique, je comprends que certaines de ces opérations ne sont pas faciles à effectuer. C'est vrai, cependant, la triste réalité est que vous ne pouvez pas déterminer la mauvaise pomme strictement à partir de laquelle les processus s'exécutaient sur le bac à sable qui s'exécutait à ce moment sans être au moins d'activer ou de désactiver les processus. Si la question concerne l'algorithme, je pense avoir répondu à cela. Si la question porte sur la façon de gérer une situation comme celle-ci, alors la question conviendrait peut-être mieux au superutilisateur SE.
la source