Je recherche une structure de données qui stocke un ensemble de chaînes sur un jeu de caractères , capable d'effectuer les opérations suivantes. On note en tant que structure de données stockant l'ensemble des chaînes .D ( S ) S
Add-Prefix-Set
on : étant donné un ensemble de chaînes (éventuellement vides), dont la taille est limitée par une constante et dont les longueurs de chaîne sont limitées par une constante, retourne . Ces deux constantes de délimitation sont globaux: ils sont les mêmes pour toutes les entrées .T D ( { t s | t ∈ T , s ∈ S } ) TGet-Prefixes
on : return . Notez que je ne me soucie pas vraiment de la structure utilisée pour cet ensemble, tant que je peux énumérer son contenu en temps .{ a | a s ∈ S , a ∈ Σ } O ( | Σ | )Remove-Prefixes
on : return .D ( { s | a s ∈ S , a ∈ Σ } )Merge
: étant donné et , retournez .D ( T ) D ( S ∪ T )
Maintenant, j'aimerais vraiment faire toutes ces opérations en temps , mais je suis d'accord avec une structure qui fait toutes ces opérations en temps , où est la longueur de la plus longue chaîne de la structure. Dans le cas de la fusion, je voudrais un temps d'exécution , où est pour la première et le pour la deuxième structure.o ( n ) n o ( n 1 + n 2 ) n 1 n n 2 n
Une exigence supplémentaire est que la structure soit immuable, ou du moins que les opérations ci-dessus renvoient de «nouvelles» structures telles que les pointeurs vers les anciennes fonctionnent toujours comme auparavant.
Une note sur l'amortissement: c'est bien, mais il faut faire attention à la persistance. Comme je réutilise les anciennes structures tout le temps, je serai en difficulté si je frappe le pire des cas avec un ensemble particulier d'opérations sur la même structure (donc en ignorant les nouvelles structures qu'il crée).
J'aimerais utiliser une telle structure dans un algorithme d'analyse sur lequel je travaille; la structure ci-dessus contiendrait l'anticipation dont j'ai besoin pour l'algorithme.
J'ai déjà envisagé d'utiliser un trie , mais le principal problème est que je ne sais pas comment fusionner les essais efficacement. Si l'ensemble de chaînes pour se Add-Prefix-Set
compose uniquement de chaînes à un seul caractère, vous pouvez stocker ces ensembles dans une pile, ce qui vous donnera des temps d'exécution pour les trois premières opérations. Cependant, cette approche ne fonctionne pas non plus pour la fusion.
Enfin, notez que je ne suis pas intéressé par les facteurs: c'est constant pour tout ce qui m'importe.
Add-Prefix-Set
)
Add-Prefix-Set
ou commencez-vous par un ensemble arbitraire de chaînes?