Pour un problème simple avec un tableau de longueur 5 pour commencer (en pratique, la longueur du tableau pourrait être de 20 ).
J'ai un prédéfini ensemble de motifs, comme AAAAB, AAABA, BAABC, BCAAA, ... . Chaque motif est de la même longueur que le tableau d'entrée. . J'ai besoin d'une fonction qui prenne n'importe quel tableau d'entiers en entrée et qui renvoie tous les modèles qu'il correspond. ( un tableau peut correspondre à quelques modèles ) aussi vite que possible.
" A "signifie que dans le modèle, tous les nombres situés aux positions de A sont égaux. Par exemple AAAAA signifie simplement que tous les nombres sont égaux, {1, 1, 1, 1, 1} correspond à AAAAA .
" B "signifie que le nombre à la position B n'est pas égal au nombre à la position A. (c'est-à-dire un joker pour un nombre qui n'est pas A). Les nombres représentés par B ne sont pas nécessairement égaux. . Par exemple ABBAA signifie que les 1er, 4e et 5e chiffres sont égaux à, disons x, et que les 2e et 3e chiffres ne sont pas égaux à x. {2, 3, 4, 2, 2} correspond à ABBAA .
" C "signifie que cette position peut être n'importe quel nombre (c'est-à-dire un joker pour un nombre). {1, 2, 3, 5, 1} correspond à ACBBA , {1, 1, 3, 5, 1} correspond également à ACBBA
Je cherche un algorithme efficace (en termes de nombre de comparaisons). Il n'a pas besoin d'être optimal, mais ne devrait pas être trop éloigné de l'optimal. J'ai l'impression que c'est un peu comme l'arbre de décision...
Une méthode très simple mais inefficace est la suivante :
-
Essayez de faire correspondre chaque modèle avec l'entrée. say AABCA contre {a, b, c, d, e} . Il vérifie si
(a=b=e && a!=c)
. -
Si le nombre de motifs est n la longueur du motif/réseau est de m alors la complexité est d'environ O(n*m)
Mise à jour :
N'hésitez pas à suggérer de meilleures formulations pour la question. Je ne sais pas comment faire pour que la question soit simple à comprendre et ne prête pas à confusion.
Un algorithme idéal nécessiterait une sorte de préparation, par exemple pour transformer l'ensemble des modèles en un arbre de décision. De sorte que les complexités après le prétraitement peut être atteint à quelque chose comme O(log n * log m) pour certains ensembles de modèles spéciaux (juste une supposition).
Quelques chiffres qui peuvent être utiles : les ensembles de modèles prédéfinis sont approximativement de la taille de 30. Le nombre de tableaux d'entrée à comparer est d'environ 10 millions.
Dis, si AAAAA y AAAAC sont tous deux dans le jeu de modèles prédéfinis. Alors si AAAAA matches, AAAAC également. Je cherche un algorithme qui pourrait reconnaître cela.
Mise à jour 2
La réponse de @Gareth Rees donne une solution O(n), mais en supposant qu'il n'y a pas beaucoup de " C "s. (sinon le stockage est énorme et les comparaisons inutiles nombreuses)
J'apprécierais également toute idée sur la manière de gérer les situations où il y a beaucoup de " C "s, disons, pour un tableau d'entrée de longueur 20, il y a au moins 10 " C " pour chaque modèle prédéfini.