web-dev-qa-db-fra.com

Meilleure structure de données pour la mise en œuvre d'un dictionnaire?

Quelle serait la meilleure structure de données pour stocker tous les mots d'un dictionnaire? La meilleure chose à laquelle je pouvais penser était d’utiliser un HashMap, qui mappera vers un HashTable. Fondamentalement, en fonction du premier caractère, nous obtiendrons le HashTable associé, puis nous pourrons ajouter les mots à partir de ce caractère. Nous choisirons ensuite une bonne fonction de hachage basée sur la chaîne.

Est-ce qu'il y a une meilleure approche?

63
Jatin

Selon ce que vous voulez faire, il existe de nombreuses bonnes structures de données.

Si vous voulez juste stocker les mots et demander "est-ce que ce mot est ici ou non?", Une table de hachage standard sans autre machine sophistiquée est une approche raisonnable. Si la liste de ce mot est fixée à l’avance, pensez à utiliser un table de hachage parfaite pour obtenir d’excellentes performances et une utilisation optimale de l’espace.

Si vous voulez être en mesure de vérifier si un préfixe donné existe tout en prenant en charge les recherches rapides, un trie est une bonne option, même si cela peut être peu efficace en termes d'espace. Il prend également en charge les insertions ou suppressions rapides. Il permet également une itération dans l'ordre alphabétique, ce que le hachage n'offre pas. C'est essentiellement la structure que vous avez décrite dans votre réponse, mais selon le cas d'utilisation, d'autres représentations de try pourraient être meilleures.

Si en plus de ce qui précède, vous savez pertinemment que la liste de mots est fixe, envisagez d'utiliser un DAWG (graphe de mots acyclique dirigé), qui est essentiellement un DFA minimal pour la langue. C'est beaucoup plus compact que le trie, mais supporte plusieurs des mêmes opérations.

Si vous souhaitez un comportement similaire à celui de l'ordinateur mais ne souhaitez pas payer une pénalité d'espace énorme, le arbre de recherche ternaire est une autre option viable, tout comme le arbre à base de radix . Ce sont des structures très différentes, mais peuvent être beaucoup mieux que le trie dans des circonstances différentes.

Si l’espace vous préoccupe mais que vous en voulez un, consultez la représentation résumé succinct , qui présente des recherches plus lentes, mais une utilisation de l’espace théoriquement optimale. Le lien explique comment il est utilisé en JavaScript comme un moyen facile de transmettre une énorme quantité de données. Une autre représentation compacte est le double-array trie , bien que je sache très peu de choses à ce sujet.

Si vous souhaitez utiliser le dictionnaire pour des opérations telles que la vérification orthographique où vous devez trouver des mots similaires à d'autres mots, le BK-tree est une excellente structure de données à considérer.

J'espère que cela t'aides!

138
templatetypedef