Le germe de cette question est venu d'une discussion que j'ai eue avec quelques collègues développeurs de l'industrie.
Il s'avère que dans de nombreux endroits, les chefs de projet se méfient des structures de données complexes et insistent généralement sur tout ce qui existe dès la sortie de la bibliothèque / des packages standard. L'idée générale semble être d'utiliser une combinaison de ce qui est déjà disponible à moins que les performances ne soient sérieusement entravées. Cela aide à garder la base de code simple, ce qui, pour les non-diplomates, signifierait "nous avons une forte attrition, et les plus récents que nous embauchons ne sont peut-être pas si bons".
Donc, pas de filtre de floraison, de listes de sauts ou d'arbres évasés pour vous, les accros du CS. Alors, voici la question (encore une fois): Quelle est la structure de données la plus compliquée que vous ayez faite ou utilisée au bureau?
Aide à avoir une idée de la qualité et de la sophistication des logiciels du monde réel.
la source
Réponses:
J'ai utilisé des listes de saut pour la recherche. Là où je travaille, il y a une implémentation standard et tout le monde est encouragé à l'utiliser. Avoir utilisé patricia essaye de stocker et de récupérer des adresses IP efficacement. Encore une fois, la mise en œuvre était déjà présente.
la source
Je suis développeur Java. Java Collection Framework peut résoudre mes problèmes de structure de données à 90%, d'autres 10% nécessitent des efforts. Je pense que si vous comprenez vraiment la bibliothèque standard sophistiquée écrite par des experts, vous trouverez qu'ils aident dans la plupart des cas.
Les structures de données complexes sont difficiles à maintenir dans le monde réel. Pour éviter de gâcher le code, je vais diviser un problème en quelques plus petits. Chaque petit problème peut être résolu par Java Collection Framework . La solution n'est peut-être pas la plus intelligente (elle a besoin de plus de mémoire et plus lente), mais elle fonctionne et est facile à entretenir. C'est un compromis.
Si je dois écrire une structure de données complexe, je prendrai un manuel :)
la source
La structure de données la plus compliquée que j'ai utilisée au travail était un trie. Mais c'était il y a vingt ans.
Le problème avec le développement de logiciels industriels est que la plupart des programmeurs industriels ne sont pas des diplômés en informatique (CompSci); par conséquent, les techniques que le diplômé CompSci moyen tient pour acquises sont considérées comme trop difficiles à maintenir pour les programmeurs du pain et du beurre.
Le manque de connaissances générales CompSci dans l'industrie est un problème grave. Par exemple, j'ai perdu le compte du nombre de développeurs de logiciels que j'ai rencontrés qui ne comprennent pas que des expressions telles que! (A! = 5 && b! = 3) et a == 5 || b == 3 sont logiquement équivalents. Quiconque sait comment appliquer le théorème de DeMorgan peut reconnaître que ces expressions sont logiquement équivalentes. La plupart des diplômés non-CompSci n'ont jamais entendu parler du théorème de DeMorgan. Si l'on examine une base de code substantielle, on trouvera de nombreuses occurrences d'expressions qui annulent les sous-expressions logiques négatives. La lisibilité du code qui contient des sous-expressions logiques négatives négatives est presque toujours améliorée en transformant ces expressions en leur forme non-négative.
la source
J'ai écrit une fois une file d'attente de calendrier (file d'attente prioritaire O (1)) pour une simulation basée sur des événements dans laquelle le profilage a montré que le tas existant était un goulot d'étranglement.
J'ai également publié un produit qui contenait une machine à états finis avec environ 80000 états - le code pour le générer était un peu compliqué, c'est le moins que l'on puisse dire.
la source
Il y a longtemps, longtemps, dans une galaxie ... A travaillé sur une équipe qui utilisait les "buffers de copains" de Knuth dans un RTOS en assembleur.
Aussi, Game of Life de Conway avec 256 générations pour un monde de 1024 x 1024.
la source
Pas vraiment utilisé quelque chose de trop spécial, ce serait une liste à double lien .
Pas très excitant, j'ai utilisé d'autres structures. Mais votre question a dit à partir de zéro.
la source
std::list
, et il n'y a vraiment rien de compliqué: / Je trouve l'arbre rouge-noir / l'arbre AVL beaucoup plus compliqué, avec toutes ces conditions de rééquilibrage!Un arbre de tables de hachage contenant des listes génériques de données financières - ne demandez même pas. Parfois, j'aimerais être un cow-boy. Ah, la vie simple sous les étoiles ...
la source
J'ai dû écrire une structure Circular Double-Linked-List à partir de zéro pour l' algorithme Dancing Links pour un solveur Sudoku. C'était comme concevoir un cube Rubik. La structure entière était essentiellement une liste de listes - chaque nœud pointant vers quatre autres.
la source
J'ai utilisé une fois un arbre de longueur de chemin pondéré pour un cache spécialisé. C'était amusant. A également écrit mes propres routines de gestion de tas pour un
malloc()
remplacement, mais beaucoup de gens l'ont fait.la source
Après y avoir réfléchi, la structure de données la plus "compliquée" que j'ai faite à partir de zéro est la modélisation d'un réseau d'éléments qui était basé sur des listes doublement liées. Mais c'était il y a des années quand je faisais de la programmation au niveau du système.
De nos jours, je ne crée pratiquement aucune structure de données sophistiquée. La plupart se produit dans la base de données où vous décidez de ce que vous mettez dans une table, peut-être une valeur précalculée peut-être l'ID d'un enregistrement connexe pour une récupération rapide afin d'éviter une recherche inutile.
Personnellement, je pense que la tâche à accomplir définit les moyens. Pourquoi s'efforcer d'utiliser une structure de données exotique si elle ne sert à rien? Et si je puis dire dans la plupart des programmes pratiques appliqués, il n'est probablement pas nécessaire de réinventer la roue.
la source
Une file d'attente prioritaire compte-t-elle? Cela apparaît dans presque toutes les applications en temps réel que j'ai écrites. Il ne fait partie de la bibliothèque Java standard que récemment (Java 1.5).
En dehors de cela, je ne peux penser à rien de compliqué que je voulais vraiment que je n'ai pas pu sortir d'une bibliothèque. Je ne laisserais pas cela m'arrêter, mais je me demanderais pourquoi j'avais besoin d'une structure de données trop exotique pour les bibliothèques. Je chercherais certainement une implémentation open-source existante d'un trie ou d'un filtre de floraison ou d'une liste de saut avant d'essayer d'en écrire un moi-même.
En général, je suis d'accord avec votre gestionnaire que le coût de construction et de maintenance d'une structure de données personnalisée trop ésotérique pour qu'il n'y ait pas de version de bibliothèque est susceptible de l'emporter sur tout avantage de performance qui en dérive. Je voudrais que vous montriez, via le profilage, que les structures de bibliothèque simples causent une pénalité de performance significative avant de vous laisser aller de l'avant et de les optimiser avec quelque chose de fantaisiste. Parce qu'en règle générale, il est moins coûteux d'acheter des cycles de processeur que des cycles d'ingénierie.
la source