Quelle est la structure de données la plus compliquée que vous ayez utilisée dans une situation pratique? [fermé]

17

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.

Fanatic23
la source
Écrit par d'autres ou par nous-mêmes?
Mon intention initiale était tout ce qui s'est développé, mais je pense que cela ajoute une dimension intéressante à la question. Question originale modifiée.
Fanatic23
Le rendre complexe ne signifie pas qu'il est sophistiqué. Plus simple = toujours mieux.
tp1
Les plus complexes étaient toujours disponibles auprès de STL. La complexité vient généralement des structures de données imbriquées, pas de leur type. Structure simple = bonne, sauf si le profileur se plaint.
Coder
-1 pour l'évaluation de la valeur inutile. Je pourrais tout aussi bien dire: de nos jours, si vous implémentez vous-même des infrastructures de données, vous êtes stupide et têtu. Ne soyez pas le prochain enfant intelligent qui pense qu'il peut implémenter une infrastructure de données dans le mauvais sens.
Pieter B

Réponses:

7

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.

aufather
la source
7

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 :)

卢 声 远 Shengyuan Lu
la source
4

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.

bit-twiddler
la source
5
Je conseille à quiconque vote un vote «négatif», d’ajouter un commentaire expliquant pourquoi on vote son vote «négatif». Je peux gérer quelqu'un ayant une opinion différente. Cependant, ce que je ne peux pas gérer, c'est la lâcheté.
bit-twiddler
2
@ bit-twiddler J'ai appris le théorème de De Morgan dans mon diplôme de philosophie. Maintenant je fais du CS, ça n'a pas été mentionné. Honnêtement cependant, je vois ce genre de choses comme un raccourci qui vient le mieux avec l'expérience. Avez-vous vraiment besoin de vous souvenir des règles (et de nom!) Que vous utilisez pour factoriser une équation? Je ne sais pas pour vous, mais je travaille sur la base de ce qui est devant moi et non par cœur. Il en va de même pour la modification des expressions logiques.
Rupert Madden-Abbott
2
@Rupert: Le Théorème de De Morgan est généralement couvert par une organisation discrète en mathématiques et en informatique (qui sont tous les deux obligatoires aux États-Unis). Je me suis concentré sur les logiciels d'architecture / systèmes informatiques en tant que premier cycle. Le théorème de De Morgan est largement utilisé dans la conception de la logique numérique. Il y a des domaines dans le développement de logiciels de bas niveau où la connaissance du théorème de De Morgan devient critique. Par exemple, il existe des ordinateurs à jeu d'instructions minimal qui ne contiennent pas un ensemble complet d'instructions booléennes; par conséquent, il faut pouvoir dériver une opération booléenne d'une autre.
bit-twiddler
1
(suite) Voici un test auquel la plupart des diplômés en informatique / génie informatique / génie électrique (concentration en génie informatique) échouent carrément ou mettent très longtemps à répondre. Étant donné uniquement l'opération NAND (négative), dérivez les opérations booléennes suivantes: NOT, AND, OR, NOR, XOR et XNOR. Connaître le théorème de De Morgan facilite la dérivation de ces six opérations booléennes. Le théorème de De Morgan est facilement le théorème le plus important dans la conception de la logique numérique.
bit-twiddler
1
..... bien que pour être juste, dans une industrie où BEAUCOUP de travail consiste à écrire des applications RoR à demi-cul pour certaines petites entreprises, il y a probablement environ 1 fois en 1000000000 où vous auriez même besoin d'avoir ENTENDU le concept de portes logiques et d'algèbre booléenne, au lieu de simplement connaître la signification des mots anglais "ou" et "et". ne dis pas que ces choses ne sont pas pertinentes pour savoir si vous faites du travail CS ou des algorithmes complexes ou des optimisations ou une programmation de bas niveau, mais pour la majorité des personnes travaillant en tant que programmeurs, c'est une sorte de futilité inutile.
sara
2

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.

Peter Taylor
la source
2

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.

dbasnett
la source
1

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
en C ++, c'est 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!
Matthieu M.
@Mathieu std :: map et vous obtiendrez très probablement un arbre rb.
aufather
1

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 ...

Scant Roger
la source
enlève les verres "Cher Dieu".
Len Joseph
1

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.

ProdigySim
la source
1
Cela semble exagéré pour un solveur Sudoku, car un algorithme de retour en arrière par force brute résout le casse-tête plus rapidement que vous ne pouvez entrer les données.
Kevin Cline
3
@kevin, la danse des liens est un algorithme de retour en arrière par force brute - mais avec une heuristique plausible.
Peter Taylor
Vous avez besoin d'une heuristique si vous voulez faire des choses comme énumérer le nombre total de solutions et affirmer qu'un Sudoku n'a qu'une seule solution unique.
ProdigySim
1

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.

TMN
la source
0

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
Mon intention n'était pas de forcer une structure de données exotique. Mais c'est une triste situation lorsque vous avez besoin de quelque chose hors de la boîte et que vous devez faire face à tout ce qui est déjà disponible simplement parce que la politique de l'entreprise l'exige.
Fanatic23
0

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.

Old Pro
la source