Je recherche une bonne structure de données pour représenter les chaînes de la forme:
JBoss:* *:* JBoss:type=ThreadPool,* JBoss:type=Thread*,* JB*:name=http1,type=ConnectionPool
Chaque "domaine" peut contenir les caractères de modèle suivants - Chaque "clé" peut contenir les caractères de modèle suivants - Chaque "valeur" peut contenir les caractères de modèle suivants - EXEMPLES: P> * code>,
? code> (
* code> - 0 ou plus caractères, ? code> - 0 ou 1 caractère) p> li>
* code>,
? code> (
* code> - 0 ou plus de caractères, ? code> - 0 ou 1 caractère) p> li>
* code>,
? code> (
* code> - 0 ou plus de caractères, ? code> - 0 ou 1 caractère) p> li>
ul>
Domain:Key1=Value1,Key2=Value2...
3 Réponses :
Je pense que le moyen le plus simple de le faire serait de construire un NFA comme Trie , une qui permet des transitions à plusieurs états. Ceci, bien sûr, ajoute la complexité d'avoir une autre structure de données qui correspond à plusieurs états donnés à un ensemble de caractères à correspondre. Par exemple, avec votre exemple: permet d'essayer de correspondre à correspondre à "code> jboxx: nom = * code> p> lorsque vous faites correspondre la sous-chaîne Tout semble avoir du sens lorsque vous pensez à la Trie comme une NFA au lieu du format DFA bien accepté. J'espère que cela pourra aider. p> p> JO code>, vous auriez besoin d'une structure de données pour contenir les états
jbo code> et
jb * code> et
* code> car vous avez trois branches à ce point. Lorsque le
x code> est entré dans, vous pouvez supprimer la route code> JO code> depuis son impasse et utilisez
jb * code> et
* code >. La mise en œuvre facile consiste à disposer d'un ensemble d'états de match possibles à tout moment et d'essayer le caractère suivant sur chacun d'eux. Vous auriez également besoin d'un moyen de résoudre plusieurs matchs (comme dans ce cas) - peut-être quelque chose d'aussi simple qu'un plus long match? P>
Kyun, merci pour les suggestions. Je crois qu'un problème similaire existe dans le thème routage dans les cadres de messagerie où des messages doivent être routés en fonction de schémas similaires. Voici un lien: rabbbitmq.com/blog/tag/dfa
Semble très similaire! J'étais sur le point de suggérer de convertir vos règles à une DFA une fois que vous avez la NFA, mais que vous feriez probablement vos mises à jour de règles plus lentes?
Vous pouvez regarder cet autre thread: Structure de données efficace Pour la recherche de mots avec des caractères génériques p>
Vous pouvez également utiliser une autre bibliothèque, telle que Lucene pour stocker et indexer les valeurs ..
Comment résolvez-vous les conflits sur les règles de correspondance, est-ce comme un match de préfixe le plus long? Par exemple, si vous aviez les deux règles, JBoss: * et *: *, JBoss: la clé = la valeur correspondrait à la fois. Vous choisissez-vous le match le plus long?
Bonjour Kyun, tu as raison, je choisirais le plus long match.