tipos tda listas lista estructura definicion datos caracteristicas abstractos java c++ stl

java - tda - ¿Las personas todavía escriben sus propias estructuras de datos y algoritmos?



tipos de datos abstractos en java (12)

¿En lugar de las bibliotecas STL y similares en otros idiomas?

Como novato, ¿cuánto debo ahondar en esta parte del desarrollo de software? ¿La amplitud primero o la profundidad?

¿Sólo es necesaria una comprensión conceptual en estos días? ¿O debería poder implementar una lista doblemente enlazada con los ojos vendados?


… ¿En lugar de las bibliotecas STL y similares en otros idiomas?

A veces quieres algo que no está en la biblioteca. Yo uso mucho las listas enlazadas circularmente. No están en la STL, no admiten las secuencias de STL y la implementación es tan simple que hacer rodar la mía es más simple que descargar.

Como novato, ¿cuánto debo ahondar en esta parte del desarrollo de software? ¿La amplitud primero o la profundidad?

No pases demasiado tiempo. Si no lo necesita de inmediato, es conocimiento teórico y la teoría es inútil sin profundidad. Trabaja a través de un buen libro de estructuras de datos y salta lo que encuentres increíblemente aburrido. Si sabe que tomará un curso sobre estructuras de datos más tarde, retire su libro con anticipación.

(Aunque solo intenté eso y terminé con un libro inútil. Luego fui a la librería de otra escuela, encontré un libro mejor y obtuve crédito de dominio sin tomar el curso de mi escuela.)

¿Sólo es necesaria una comprensión conceptual en estos días? ¿O debería poder implementar una lista doblemente enlazada con los ojos vendados?

Toma el término medio. Necesitas conocer las propiedades de las estructuras para poder encontrar errores resultantes del uso de la estructura incorrecta. Pero no te aburras en la implementación de árboles rojo-negros, y ciertamente no hagas el hábito de codificar las estructuras que podrías preparar previamente.


Debes poder escribir tus propias estructuras de datos. En realidad hacerlo para un trabajo debería ser una circunstancia inusual. Las colecciones STL o Java de C ++ o las estructuras de datos proporcionadas por .NET deben ser válidas para el 99% de las circunstancias.

Escribí algunas estructuras de datos personalizadas hace un año para un proyecto de trabajo porque pudimos aprovechar las propiedades únicas de nuestros datos para usar un mapa de memoria en disco, comprimirlo, almacenar la mayor parte en los índices, usar bits del desplazamiento punteros para indicar el tipo del siguiente objeto de datos y hacer que sea lo suficientemente ofuscado como para disuadir a la mayoría de las personas de intentar leer nuestra base de datos.

Sin embargo, esa oportunidad solo me sucedió una vez en diez años.


Desde el punto de vista del desarrollo profesional, debe poder implementar lo que necesite; es posible que algún día tenga que implementar algo que no existe en una biblioteca, y también tenga que inventar nuevos algoritmos de vez en cuando.

Sin embargo, para volverse productivo más rápido, primero aprenda cómo evaluar una estructura de datos de biblioteca o plantilla; ¿Cuál es el costo de tiempo, el costo de la memoria, la capacidad de mantenimiento, etc.? Eso te hará escribir mejor el código antes. Pero no te detengas ahí, aprende a implementarlos también. Estudie las implementaciones de las bibliotecas de código abierto para que sepa cómo funcionan, no solo lo que hacen.


Digo que todos deberían saber cómo implementar las estructuras de datos básicas, como las listas doblemente enlazadas. Sin esa comprensión, ¿cómo puede decir que entiende los punteros y otras cosas relevantes? Creo que para un programador decente, la mayoría de las estructuras de datos básicas deberían ser triviales de implementar ingenuamente, y no tardar más de un día en implementarse decentemente.


El hecho de que muchos idiomas / SDK, etc., proporcionen esta información para usted ya no significa que no sea importante que todavía se entienda cómo funcionan y que la mejor manera de entender los algoritmos es escribirlos usted mismo.

Especialmente si se encuentra trabajando a tiempo en un código crítico, entonces el costo de todo lo que usa es importante y, a menos que conozca la diferencia en la implementación entre varias estructuras de datos, puede que esté utilizando las opciones menos eficientes.

Y para responder a la pregunta en la línea de asunto, sí: muchas personas aún escriben sus propias implementaciones cuando la velocidad / el espacio / la plataforma están restringidos y necesitan saber exactamente qué sucede dentro de sus funciones. Sé que en la industria de los videojuegos a menudo escribimos nuestras propias clases de contenedores rápidas y eficientes en memoria que están optimizadas para cada plataforma de destino.


Hablando como un novato, me hice esta pregunta y la respondí sin ninguna necesidad de conocimientos reales de programación. Estos temas aparecen en entrevistas técnicas para las principales compañías de software. Las principales compañías de software tienen los mejores ingenieros (de lo contrario, no estarían en la cima). Por lo tanto, sus prácticas de contratación deben seleccionar a los mejores y una especie de mercado que el Darwinismo selecciona para aquellas empresas que son mejores en la selección de nuevas contrataciones. Entonces, lo que estas empresas buscan debe ser relevante para ser un buen desarrollador de software, de lo contrario no estarían en la cima. Por lo tanto estos temas (algoritmos y estructuras de datos) son importantes. Si fueran solo un aro arbitrario en el que estas compañías hacen saltar a los codificadores, dichas compañías habrían sido desplazadas por otras compañías que contratan a los buenos candidatos que rechazan incorrectamente.


Muchas veces en sistemas embebidos, las estructuras de datos son reescritas. El STL puede contener algoritmos y estructuras de datos que son excesivas para plataformas más pequeñas. Los algoritmos STL y las estructuras de datos están generalizados. Las generalizaciones ocupan código y espacio de memoria que podrían usarse para otras funciones.

Existen otras estructuras de datos que normalmente se reescriben que no forman parte de la STL. Un ejemplo es un búfer de anillo o una cola circular. Algunas tiendas intentan reescribir el código para evitar los aranceles de licencia o las leyes de derechos de autor cuando se usan bibliotecas disponibles.


Personalmente siento que estas cosas caen bajo la Ley de abstracciones con fugas .

Seguro que podrías pasar tus días escribiendo código C # con un buen tipo de string , pero en algún momento tendrás que entender la diferencia entre "/r/n" y "/n" y por qué svn parece importar bien desde Windows, pero los errores en su máquina Linux, y eso es cuando ayuda a implementar funciones de cadena.

Como alguien que ha estado codificando durante la última década: no, no reescribo las listas doblemente enlazadas, sino porque las he escrito las primeras cien veces. Entonces, como nuevo programador, hazlo un par de veces, luego toma una buena API. Preferiblemente un documento bien uno ...


Se sabe que codifiqué una clasificación de fusión cuando se trabaja con datos demasiado grandes para que quepan en la memoria, solo por un ejemplo. Entonces, sí, es muy útil conocer los límites de las herramientas estándar y cuándo podría hacerlo mejor con algo especializado.


Si bien nadie realmente tira sus propias pilas o colas, es muy importante entender cómo y por qué son diferentes. Entonces, no, para usar estructuras de datos simples de manera efectiva, no es 100% necesario para poder realizar todas las comprobaciones de errores adecuadas para los bucles / cola nula / concurrencia / etc en una lista enlazada mientras se tienen los ojos vendados.

Sin embargo, si bien las estructuras de datos más simples no se reescriben una y otra vez, los árboles y los gráficos a menudo siguen siendo personalizados, y probablemente no podrá hacer nada con ellos sin comprender las estructuras de datos más básicas.

Además, a menudo se incluyen en las "preguntas de la entrevista", por lo que vale la pena saber cómo hacerlo, incluso si en realidad no reescribes una lista con doble enlace en el código en vivo.


Todo depende de lo que necesites o quieras hacer.

Si tiene un arma en la cabeza y necesita sacar algo por la puerta, probablemente es suficiente con entender qué estructura / algoritmo lo llevará a su fin más rápido.

Si está encontrando un cuello de botella en su código y puede rastrearlo hasta un algoritmo / estructura, entonces es posible que deba ir más profundo.

Si eres estudiante, seguro, ¡aprende tanto sobre ellos como quieras!


debe haber oído acerca de la regla 80/20. El 80% de los desarrolladores no tienen experiencia práctica (en el mundo real) en la implementación de estructuras de datos en el idioma de su elección. Entonces, para ser uno entre ese 20%, intente aprenderlo y obtener esa experiencia práctica. Dicho esto, en realidad el 80% del trabajo que harías no requeriría implementar tu propio DS. En caso de lenguaje como Java y C #, a veces escribir su propio DS provocaría críticas. Tiene paquetes / librabries para la mayoría de sus necesidades. Pero al implementar estos DS en tu idioma, mejorarás tus habilidades de programación. Así que sigue adelante y comienza con tu pila y cola personalizadas. Estoy seguro de que lo primero que aprendería (en caso de que esté utilizando java / c # como idioma de su elección) son las pérdidas de memoria :)