Je pense qu'une base de données efficace sera une base de données modifiée. essai avec des liens bidirectionnels [ils peuvent aller des feuilles à la racine et reconstruire le mot], et chaque nœud terminal aura un champ "valeur" supplémentaire.
Vous aurez également besoin d'une carte multiple [c'est-à-dire une carte dans laquelle chaque valeur est un ensemble d'adresses].
Les clés seront disposées en forme d'arbre, et l'ensemble des valeurs sera basé sur le hachage. [En jave, cela devrait être quelque chose comme TreeMap<Integer,HashSet<Node>>
]
Pseudo-code : [enfin, très pseudo... il montre juste les idées générales pour chaque opération].
Insert(key):
1. Insert a word into the trie
2. add the value `1` to the terminating node.
3. add the terminating field to the multimap [i.e. map.add(1,terminating_node_address)]
Increment(key):
1. read the word in the trie, and store the value from the terminating node as temp.
2. delete the entree (temp,terminating_node_address) from the multimap.
3. insert the entree (temp+1,terminating_node_address) to the multimap.
4. increase the value of the terminating node's address by 1.
Find(key):
1. find the terminating node for the key in the trie, return its value.
Select(part_of_key):
1. go to the last node you can reach with part_of_key.
2. from this node: do BFS and retrieve all possible words [store them in an empty set you will later return].
Max(i):
1. find the i'th biggest element key in the multimap.
2. choose an arbitrary address, and return get the relevant terminating word node.
3. build the string by following the uplinks to the root, and return it.
les complexités :
let n
soit le nombre de chaînes de caractères, k
soit la valeur maximale, et S
la longueur d'une chaîne de caractères.
Insérer : O(S) [l'insertion de trie est O(S)]. Le plus petit élément (1) de la carte peut être mis en cache, et peut donc être accessible en O(1).
Incrément : O(S+logk) : trouver la chaîne de caractères dans un trie est O(S), trouver la clé pertinente est O(logk), supprimer un élément d'un ensemble de hachage est O(1), trouver l'élément suivant dans l'arbre est également O(logk) [peut être O(1) en fait, pour un liste d'exclusion carte basée], et l'insertion d'une valeur est O(1). Notez qu'en liant le nœud à la clé pertinente dans la carte, la complexité de l'opération est de O(1). peut même être amélioré à O(S) puisque aucune recherche n'est réellement nécessaire.
Trouver : O(S) : il suffit de trouver dans la trie et de retourner la valeur.
Sélectionnez : O(S*n) Dans le pire des cas, vous devez récupérer tous les éléments, ce qui vous oblige à itérer la trie entière afin de trouver tous les mots.
Max : O(logk+S) : trouver une clé dans une carte triée, reconstituer le mot.
EDIT : Notez qu'ici, j'ai supposé que pour find(i) vous voulez le i'th distinct l'élément le plus important. Si ce n'est pas le cas, vous devrez modifier un peu l'ensemble et utiliser une multimap qui permet de dupliquer les clés [au lieu d'un ensemble comme valeur]. Cela rendra toutes les opérations basées sur l'arbre O(logn) au lieu de O(logk), toujours efficace à mon avis...