¿Cuál es la estructura de datos más complicada que ha utilizado en una situación práctica? [cerrado]

17

El germen de esta pregunta surgió de una discusión que estaba teniendo con un par de colegas desarrolladores de la industria.

Resulta que, en muchos lugares, los gerentes de proyecto desconfían de las estructuras de datos complejas y, en general, insisten en lo que exista fuera de la caja de la biblioteca / paquetes estándar. La idea general parece ser usar una combinación de lo que ya está disponible a menos que el rendimiento se vea seriamente impedido. Esto ayuda a mantener la base del código simple, lo que para los no diplomáticos significaría "tenemos un alto desgaste, y los nuevos que contratamos pueden no ser tan buenos".

Por lo tanto, no hay filtros de floración ni listas de omisión o árboles de despliegue para sus adictos a CS. Así que aquí está la pregunta (nuevamente): ¿Cuál es la estructura de datos más complicada que hizo o usó en la oficina?

Ayuda a tener una idea de cuán bueno / sofisticado es el software del mundo real.

Fanático23
fuente
¿Escrito por otros o por nosotros mismos?
Mi intención original era lo que sea que se haya desarrollado, pero creo que agrega una dimensión interesante a la pregunta. Pregunta original editada.
Fanatic23
Hacerlo complejo no significa que sea sofisticado. Más simple = mejor siempre.
tp1
Los más complejos siempre estuvieron disponibles en STL. La complejidad generalmente proviene de estructuras de datos anidados, no de su tipo. Estructura simple = buena, a menos que el perfilador se queje.
Codificador
-1 para evaluación de valor innecesario. Podría decir lo mismo: en estos días, si implementa estructuras de datos usted mismo, está siendo tonto y terco. No seas el próximo chico inteligente que piensa que puede implementar una estructura de datos de la manera incorrecta.
Pieter B

Respuestas:

7

Han usado listas de omisión para la búsqueda. Donde trabajo, hay una implementación estándar y se alienta a todos a usarla. Han utilizado los intentos de Patricia para almacenar y recuperar direcciones IP de manera eficiente. Nuevamente, la implementación ya estaba presente.

aufather
fuente
7

Soy desarrollador de Java. Java Collection Framework puede resolver mis problemas de estructura de datos del 90%, otro 10% necesita esfuerzo. Creo que si realmente comprende la sofisticada biblioteca estándar escrita por expertos, encontrará que ayudan en la mayoría de los casos.

Las estructuras de datos complejas son difíciles de mantener en el mundo real. Para evitar desordenar el código, dividiré un problema en algunos más pequeños. Cada pequeño problema puede ser resuelto por Java Collection Framework . Quizás la solución no sea la más inteligente (necesita más memoria y más lenta), pero funciona y es fácil de mantener. Es una compensación.

Si debo escribir una estructura de datos compleja, recogeré el libro de texto :)

卢 声 远 Shengyuan Lu
fuente
4

La estructura de datos más complicada que he usado en el trabajo fue un trie. Sin embargo, eso fue hace veinte años.

El problema con el desarrollo de software industrial es que la mayoría de los programadores industriales no son graduados en informática (CompSci); por lo tanto, las técnicas que el graduado promedio de CompSci da por sentado se consideran demasiado difíciles de mantener para los programadores de pan y mantequilla.

La falta de conocimiento general de CompSci en la industria es un problema grave. Por ejemplo, he perdido la cuenta de la cantidad de desarrolladores de software que he conocido que no entienden expresiones como! (A! = 5 && b! = 3) y a == 5 || b == 3 son lógicamente equivalentes. Cualquiera que sepa cómo aplicar el teorema de DeMorgan puede reconocer que estas expresiones son lógicamente equivalentes. La mayoría de los graduados que no son de CompSci nunca han oído hablar del Teorema de DeMorgan. Si se examina cualquier base de código sustancial, se encontrarán muchas ocurrencias de expresiones que niegan subexpresiones lógicas negativas. La legibilidad del código que contiene subexpresiones lógicas negativas negadas casi siempre se mejora transformando estas expresiones en su forma no negada.

bit-twiddler
fuente
55
Mi consejo para cualquiera que vote "abajo" es que se debe agregar un comentario que indique por qué se echa el voto "abajo". Puedo manejar a alguien que tiene una opinión diferente. Sin embargo, lo que no puedo manejar es la cobardía.
bit-twiddler
2
@ bit-twiddler Aprendí el Teorema de De Morgan en mi título de Filosofía. Ahora estoy haciendo CS, no se ha mencionado. Honestamente, sin embargo, veo este tipo de cosas como una taquigrafía que viene mejor con la experiencia. ¿Realmente necesitas recordar las reglas (¡y por nombre!) Que empleas al factorizar una ecuación? No sé sobre ti, pero lo resuelvo en función de lo que está delante de mí y no de memoria. Lo mismo vale para modificar expresiones lógicas.
Rupert Madden-Abbott
2
@Rupert: el teorema de De Morgan generalmente está cubierto en matemática discreta y organización de la computadora (los cuales son cursos obligatorios de pregrado en los EE. UU.). Me concentré en arquitectura de computadoras / software de sistemas como estudiante. El teorema de De Morgan se usa mucho en el diseño de lógica digital. Hay áreas en el desarrollo de software de bajo nivel donde conocer el Teorema de De Morgan se vuelve crítico. Por ejemplo, hay computadoras con un conjunto mínimo de instrucciones que no contienen un conjunto completo de instrucciones booleanas; por lo tanto, uno debe poder derivar una operación booleana de otra.
bit-twiddler
1
(cont) Aquí hay una prueba que la mayoría de los graduados que no son de ciencias de la computación / ingeniería informática / ingeniería eléctrica (concentración de ingeniería informática) fallan directamente o tardan mucho tiempo en responder. Dada solo la operación NAND (negativa), deriva las siguientes operaciones booleanas: NOT, AND, OR, NOR, XOR y XNOR. Conocer el teorema de De Morgan hace que derivar esas seis operaciones booleanas sea mucho más fácil. El teorema de De Morgan es fácilmente el teorema más importante en el diseño de lógica digital.
bit-twiddler
1
..... aunque para ser justos, en una industria en la que MUCHO trabajo se dedica a escribir aplicaciones RoR a medias para algunas pequeñas empresas, es probable que haya alrededor de 1 vez en 1000000000 en el que incluso sea necesario que ESCUCHE concepto de puertas lógicas y álgebra booleana, en lugar de simplemente conocer el significado de las palabras inglesas "o" y "y". No digo que estas cosas no sean relevantes para saber si estás haciendo trabajo de CS o algoritmos complejos u optimizaciones o programación de bajo nivel, pero para la mayoría de las personas que trabajan como programadores, es una especie de trivia inútil.
sara
2

Una vez escribí una cola de calendario (cola de prioridad O (1)) para una simulación basada en eventos en la que el perfil mostró que el montón existente era un cuello de botella.

También lancé un producto que contenía una máquina de estados finitos con aproximadamente 80000 estados; el código para generarlo era un poco complicado, por decir lo menos.

Peter Taylor
fuente
2

Hace mucho, mucho tiempo, en una galaxia ... Trabajé en un equipo que usó los "amortiguadores de amigos" de Knuth en un RTOS en ensamblador.

Además, Conway's Game of Life con 256 generaciones para un mundo de 1024 x 1024.

dbasnett
fuente
1

Realmente no usé nada demasiado especial, desde cero sería una lista doblemente vinculada .

No es muy emocionante, he usado otras estructuras. Pero su pregunta dijo desde cero.


fuente
en C ++, eso es std::list, y realmente no hay nada complicado: / ¡Me parece que el árbol rojo-negro / AVL es mucho más complicado, con todas esas condiciones de reequilibrio!
Matthieu M.
@Mathieu std :: map y lo más probable es que obtenga un árbol rb.
aufather
1

Un árbol de tablas de hash que contiene listas genéricas de datos financieros, ni siquiera pregunte. A veces desearía ser un vaquero. Ah, la vida simple bajo las estrellas ...

Roger escaso
fuente
Se quita las gafas "Querido Dios".
Len Joseph
1

Tuve que escribir una estructura circular de lista doblemente vinculada desde cero para algoritmo Dancing Links para un solucionador de Sudoku. Se sintió como diseñar un cubo de Rubik. Toda la estructura era básicamente una lista de listas, con cada nodo apuntando a otros cuatro.

ProdigySim
fuente
1
Eso suena como una exageración para un solucionador de Sudoku, ya que un algoritmo de retroceso de fuerza bruta resuelve el rompecabezas más rápido de lo que puede ingresar los datos.
Kevin Cline
3
@kevin, links de baile es un algoritmo de retroceso de fuerza bruta, pero con una heurística plausible.
Peter Taylor
Necesita una heurística si va a hacer cosas como enumerar el número total de soluciones y afirmar que un Sudoku tiene solo 1 solución única.
ProdigySim
1

Una vez utilicé un árbol de longitud de ruta ponderada para un caché especializado. Eso fue divertido. También escribí mis propias rutinas de gestión de almacenamiento dinámico para un malloc()reemplazo, pero mucha gente lo ha hecho.

TMN
fuente
0

Después de pensarlo, la estructura de datos más "complicada" que he hecho desde cero es modelar una red de elementos basada en listas doblemente vinculadas. Pero eso fue hace años cuando solía hacer programación a nivel de sistema.

En estos días apenas creo estructuras de datos sofisticadas. La mayor parte ocurre en la base de datos donde decide lo que pone en una tabla, tal vez algún valor precalculado, tal vez la ID de algún registro relacionado para una recuperación rápida para evitar búsquedas innecesarias.

Personalmente, creo que la tarea en cuestión define los medios. ¿Por qué esforzarse por hacer uso de alguna estructura de datos exóticos si no sirve de nada? Y si puedo decir en la mayoría de la programación práctica aplicada, probablemente no haya necesidad de reinventar la rueda.


fuente
Mi intención no era forzar la entrada de una estructura de datos exótica. Pero es una situación triste cuando necesitas algo fuera de la caja y tienes que lidiar con lo que ya está disponible solo porque la política corporativa lo dicta.
Fanatic23
0

¿Cuenta una cola prioritaria? Eso aparece en casi todas las aplicaciones en tiempo real que he escrito. Se convirtió en parte de la biblioteca estándar de Java recientemente (Java 1.5).

Aparte de eso, no puedo pensar en nada complicado que realmente quisiera que no haya podido sacar de una biblioteca. No dejaría que eso me detuviera, pero me preguntaría por qué necesitaba una estructura de datos demasiado exótica para que las bibliotecas la incluyeran. Definitivamente, buscaría una implementación de código abierto existente de un filtro trie o bloom o una lista de omisión antes de intentar escribir uno yo mismo.

En general, estoy de acuerdo con su gerente en que el costo de construir y mantener una estructura de datos personalizada demasiado esotérica para que no haya una versión de biblioteca probablemente supere cualquier beneficio de rendimiento derivado de ella. Quisiera que mostraras, a través de la creación de perfiles, que las estructuras de la biblioteca simple están causando una penalización de rendimiento significativa antes de dejarte seguir adelante y optimizarlas con algo elegante. Porque como regla general, es más barato comprar ciclos de procesador que ciclos de ingeniería.

Viejo pro
fuente