Une des choses qui me manque lors de l'écriture de programmes en C est une structure de données de dictionnaire. Quel est le moyen le plus pratique d'en implémenter un en C? Je ne recherche pas la performance, mais la facilité de le coder à partir de zéro. Je ne veux pas non plus que ce soit générique - quelque chose comme string-> int fera l'affaire. Mais je veux qu'il puisse stocker un nombre arbitraire d'articles.
Il s'agit plutôt d'un exercice. Je sais qu'il existe des bibliothèques tierces disponibles que l'on peut utiliser. Mais considérez un instant qu'ils n'existent pas. Dans une telle situation, quel est le moyen le plus rapide d'implémenter un dictionnaire répondant aux exigences ci-dessus.
c
data-structures
dictionary
Rohit
la source
la source
Réponses:
La section 6.6 du langage de programmation C présente une structure de données de dictionnaire simple (table de hachage). Je ne pense pas qu'une implémentation de dictionnaire utile puisse être plus simple que cela. Pour votre commodité, je reproduis le code ici.
Notez que si les hachages de deux chaînes entrent en collision, cela peut entraîner un
O(n)
temps de recherche. Vous pouvez réduire la probabilité de collisions en augmentant la valeur deHASHSIZE
. Pour une discussion complète de la structure des données, veuillez consulter le livre.la source
hashval = *s + 31 * hashval;
exactement 31 et rien d'autre?Le moyen le plus rapide serait d'utiliser une implémentation déjà existante, comme uthash .
Et, si vous voulez vraiment le coder vous-même, les algorithmes de
uthash
peuvent être examinés et réutilisés. Il est sous licence BSD, donc, mis à part l'obligation de transmettre l'avis de droit d'auteur, vous êtes pratiquement illimité dans ce que vous pouvez en faire.la source
Pour faciliter la mise en œuvre, il est difficile de battre naïvement la recherche dans un tableau. Outre une vérification des erreurs, il s'agit d'une implémentation complète (non testée).
la source
Créez une fonction de hachage simple et des listes de structures liées, en fonction du hachage, attribuez la liste liée dans laquelle insérer la valeur. Utilisez également le hachage pour le récupérer.
J'ai fait une implémentation simple il y a quelque temps:
la source
GLib et gnulib
Ce sont probablement vos meilleurs paris si vous n'avez pas d'exigences plus spécifiques, car ils sont largement disponibles, portables et probablement efficaces.
GLib: https://developer.gnome.org/glib/ par le projet GNOME. Plusieurs conteneurs documentés à l' adresse : https://developer.gnome.org/glib/stable/glib-data-types.html, y compris «Hash Tables» et «Balanced Binary Trees». Licence: LGPL
gnulib: https://www.gnu.org/software/gnulib/ par le projet GNU. Vous êtes censé copier-coller la source dans votre code. Plusieurs conteneurs documentés sur: https://www.gnu.org/software/gnulib/MODULES.html#ansic_ext_container, y compris "rbtree-list", "linkedhash-list" et "rbtreehash-list". Licence GPL.
Voir aussi: Existe-t-il des bibliothèques C open source avec des structures de données communes?
la source
voici un outil rapide, je l'ai utilisé pour obtenir une 'Matrix' (sruct) à partir d'une chaîne. vous pouvez également avoir un tableau plus grand et modifier ses valeurs en cours d'exécution:
la source
Je suis surpris que personne n'ait mentionné l' ensemble de bibliothèques hsearch / hcreate qui, bien que n'étant pas disponible sur Windows, mais mandaté par POSIX, et donc disponible dans les systèmes Linux / GNU.
Le lien a un exemple de base simple et complet qui explique très bien son utilisation.
Il a même une variante thread-safe, est facile à utiliser et très performant.
la source
Une table de hachage est l'implémentation traditionnelle d'un simple «dictionnaire». Si vous ne vous souciez pas de la vitesse ou de la taille, recherchez simplement sur Google . Il existe de nombreuses implémentations disponibles gratuitement.
voici le premier que j'ai vu - en un coup d'œil, cela me semble correct. (c'est assez basique. Si vous voulez vraiment qu'il contienne une quantité illimitée de données, vous devrez ajouter un peu de logique pour "réallouer" la mémoire de la table à mesure qu'elle grandit.)
bonne chance!
la source
Le hachage est la clé. Je pense utiliser une table de recherche et une clé de hachage pour cela. Vous pouvez trouver de nombreuses fonctions de hachage en ligne.
la source
La méthode la plus rapide serait d'utiliser un arbre binaire. Son pire cas est également seulement O (logn).
la source