¿En qué lenguaje de programación recomendarías aprender sobre estructuras de datos y algoritmos ?
Considerando lo siguiente:
- Experiencia personal
- Funciones de idioma (punteros, OO, etc.)
- Idoneidad para aprender los conceptos de DS & A
Pregunto porque hay algunos libros que son independientes del lenguaje de programación (escritos desde una perspectiva matemática y usan pseudocódigo). Si aprendo de uno de estos, me gustaría elegir un lenguaje de programación para codificar y ejecutar los algoritmos.
Luego, hay otros libros que introducen conceptos de DS & A con ejemplos escritos en un idioma de programación en particular, y me gustaría codificar estos algoritmos también, por lo que, hasta cierto punto, el idioma también elige el libro.
De cualquier manera, tengo que elegir un idioma y prefiero ceñirme a uno en todo momento. Dejando de lado las preferencias lingüísticas personales, ¿cuál es mejor para este propósito?
Respuestas:
La respuesta a esta pregunta depende exactamente de lo que quieras aprender.
Python y Ruby
A menudo se sugieren lenguajes de alto nivel como Python y Ruby porque son de alto nivel y la sintaxis es bastante legible. Sin embargo, todos estos lenguajes tienen abstracciones para las estructuras de datos comunes. No hay nada que le impida implementar sus propias versiones como ejercicio de aprendizaje, pero es posible que descubra que está construyendo estructuras de datos de alto nivel sobre otras estructuras de datos de alto nivel, lo que no es necesariamente útil.
Además, Ruby y Python son lenguajes de tipado dinámico. Esto puede ser bueno, pero también puede ser confuso para el principiante y puede ser más difícil (inicialmente) detectar errores, ya que normalmente no serán evidentes hasta el tiempo de ejecución.
C
C está en el otro extremo. Es bueno si desea aprender detalles de muy bajo nivel, como cómo se administra la memoria, pero la administración de la memoria de repente es una consideración importante, como en el uso correcto de malloc () / free (). Eso puede distraer. Además, C no está orientado a objetos. Eso no es malo, pero simplemente vale la pena señalarlo.
C ++
Se ha mencionado C ++. Como dije en el comentario, creo que esta es una elección terrible . C ++ es horriblemente complicado incluso en un uso simple y tiene una cantidad ridícula de "trampas". Además, C ++ no tiene una clase base común. Esto es importante porque las estructuras de datos como las tablas hash dependen de que haya una clase base común. Podría implementar una versión para una clase base nominal, pero es un poco menos útil.
Java
También se ha mencionado Java. A muchas personas les gusta odiar Java y es cierto que el lenguaje es extremadamente detallado y carece de algunas de las características del lenguaje más modernas (por ejemplo, cierres), pero nada de eso realmente importa. Java tiene un tipo estático y tiene recolección de basura. Esto significa que el compilador de Java detectará muchos errores que los lenguajes tipados dinámicamente no (hasta el tiempo de ejecución) y no hay que lidiar con las fallas de segmentación (lo que no quiere decir que no pueda perder memoria en Java; obviamente, puede). Creo que Java es una buena elección.
C#
C # el lenguaje es como una versión más moderna de Java. Como Java, es un lenguaje compilado intermedio administrado (recolectado de basura) que se ejecuta en una máquina virtual. Todos los demás lenguajes enumerados aquí, aparte de C / C ++, también se ejecutan en una máquina virtual, pero Python, Ruby, etc. se interpretan directamente en lugar de compilarse en un código de bytes.
Básicamente, C # tiene los mismos pros y contras que Java.
Haskell (etc.)
Por último, tienes lenguajes funcionales: Haskell, OCaml, Scheme / Lisp, Clojure, F #, etc. Estos piensan en todos los problemas de una manera muy diferente y vale la pena aprenderlos en algún momento, pero nuevamente todo se reduce a lo que quieres aprender: programación funcional o estructuras de datos? Me limitaría a aprender una cosa a la vez en lugar de confundir el tema. Si aprende un lenguaje funcional en algún momento (lo que recomendaría), Haskell es una buena opción y segura.
Mi consejo
Elija Java o C #. Ambos tienen IDE excelentes y gratuitos (Eclipse, Netbeans e IntelliJ Community Edition para Java, Visual Studio Express para C #, Visual Studio community edition) que facilitan la escritura y ejecución de código. Si no usa una estructura de datos nativa más compleja que una matriz y cualquier objeto que usted mismo escriba, aprenderá básicamente lo mismo que en C / C ++ pero sin tener que administrar la memoria.
Permítanme explicar: una tabla hash extensible debe cambiar de tamaño si se agregan suficientes elementos. En cualquier implementación, eso significará hacer algo como duplicar el tamaño de la estructura de datos de respaldo (generalmente una matriz) y copiar los elementos existentes. La implementación es básicamente la misma en todos los lenguajes imperativos, pero en C / C ++ tienes que lidiar con fallas de segmentación cuando no asignas o desasignas algo correctamente.
Python o Ruby (realmente no importa cuál) sería mi próxima opción (y muy cerca de las otras dos) solo porque la escritura dinámica podría ser problemática al principio.
fuente
Recomendaría
Java
principalmente porque:EDITAR: Votantes en contra, expliquen.
fuente
En mi opinión, C sería el mejor lenguaje para aprender estructuras de datos y algoritmos porque te obligará a escribir el tuyo propio. Lo obligará a comprender los punteros, la asignación de memoria dinámica y las implementaciones detrás de las estructuras de datos populares como listas vinculadas, tablas hash, etc. Muchas de las cuales son cosas que puede dar por sentado en lenguajes de nivel superior (Java, C #, etc. ).
fuente
Python
es genial. Fácil de leer, con todas las funciones. Si va a trabajar con pseudocódigo, Python le resultará bastante familiar.Python ya es el lenguaje de algoritmos preferido en UC Irvine , donde se describe así:
" Python representa un lenguaje orientado a algoritmos que ha sido muy necesario en la educación. Las ventajas de Python incluyen su sintaxis similar a un libro de texto y su interactividad que fomenta la experimentación . "
Python también funciona de manera amigable para principiantes con Gato , una herramienta para hacer gráficos. Aprender algoritmos y estructuras de datos es una de las principales cosas que puede ayudar al hacerse visual, algo que Gato hace que sea fácil de hacer (sin aprender bibliotecas de gráficos complejas)
fuente
Si el propósito es solo aprender sobre estructuras de datos y algoritmos , diría JavaScript. Puede ejecutar su código en un navegador. Tiene un manejo de objetos muy flexible y puede enfocarse completamente en las estructuras de datos y algoritmos y no en la administración de la memoria, construcciones de lenguaje u otras cosas que desviarán el enfoque de la informática real que está aprendiendo.
La ventaja también es que puede visualizar fácilmente varias estructuras de datos utilizando el navegador para representar gráficos y árboles utilizando DOM y Canvas.
Los cursos de informática a lo largo de los años tienden a cambiar el idioma en el que se imparte la asignatura, simplemente porque han llegado nuevas y mejores implementaciones de idiomas que facilitan el aprendizaje, lo que hace que sea más fácil concentrarse en el problema real.
fuente
Si quieres tomar el camino de menor resistencia, entonces Python. Tendrá la cantidad mínima de placa de caldera innecesaria y cosas por el estilo.
Idealmente, me gustaría aprender algoritmos en C, para que puedas saber qué está pasando a nivel de memoria; También me gustaría aprender algoritmos en un lenguaje funcional, para que pueda ver cómo funcionan algoritmos similares con estructuras de datos persistentes.
Los famosos libros de Knuth contienen grandes cantidades de código ensamblador (plataforma inventada). Esto se recomienda si quieres ser súper duro. Personalmente, sin embargo, trabajé en C cuando estaba trabajando en mi clase de algoritmos (revelación: esto fue hace solo un par de años). A veces trabajo en algunos problemas en Knuth, pero no sé si elegiría MMIX por completo como mi idioma de elección para aprender algoritmos. Creo que es un poco exagerado.
EDITAR : También depende de con lo que esté familiarizado. Si desea comenzar a trabajar a través de un texto de algoritmos en este momento, y nunca ha trabajado mucho con C, entonces Python es de lejos la respuesta correcta. Quieres que el idioma no sea un gran obstáculo que superar, porque quieres disfrutarlo. Sé que lo hice.
Último punto: al menos cuando estaba aprendiendo algoritmos, pasaba muchísimo tiempo trabajando en papel. Creo que eso es importante, quiero decir que quieres aprender sobre asintóticos, etc. Pasar todo tu tiempo implementando algoritmos en cualquier idioma no es lo que debes hacer.
fuente
Sugeriría a Ada. Tiene características para construcciones de datos que no se encuentran en otros lenguajes, como comprobaciones de rango.
type Day is range 1 .. 31;
También tiene comprobaciones muy estrictas en tiempo de compilación y ejecución (a menos que elija desactivarlo), lo que facilita la búsqueda de errores en su implementación.fuente
Oberon-2 o Componente Pascal . El último es un superconjunto del primero.
Einstein dijo una vez: "Hágalo lo más simple posible, pero no más simple". Esta frase fue elegida por el profesor Niklaus Wirth como epígrafe del informe lingüístico original de Oberon. Y es cierto para los descendientes de Oberón mencionados anteriormente.
Cuando se trata de la perfección del lenguaje de programación, me gusta citar a Antoine de Saint-Exupéry: "Un diseñador sabe que ha llegado a la perfección no cuando ya no hay nada que agregar, sino cuando ya no hay nada que quitar". . Wirth, incluso si no lo logró, está en el camino correcto. En "Línea de lenguajes de programación Wirth" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) cada lenguaje subsiguiente es más simple y al mismo tiempo más poderoso que el anterior.
Lenguajes potentes pero sencillos que siguen el principio de la mínima sorpresa. Tipado estático fuerte, facilidades orientadas a objetos fáciles, recolección de basura. La lista de funciones no es grande, pero es suficiente para ser productivo y no complicar las cosas, especialmente en las etapas iniciales.
Cuando quiere aprender algoritmos y estructuras de datos, lo dice en serio. Pero si su lenguaje es "poderoso" (tiene muchas características como C ++, C #, Java, Python, ...) perderá mucho tiempo aprendiendo lenguaje, no algoritmos ni estructuras de datos. No verás el bosque por los árboles. =) Puede pensar en los árboles como elementos de sintaxis (y cualquier otra característica) y en el bosque como un concepto importante (cualquier algoritmo, estructura de datos, puede ser POO, lo que sea). Cuantas más características (árboles) tenga en su idioma, más complicada será la tarea de dar un paso atrás y comprender los conceptos (ver el bosque).
Pero si el lenguaje es realmente poderoso (tiene un pequeño conjunto de características bien probadas), el lenguaje en sí pasa a un segundo lugar. No hay tantos árboles, así que puedes dar un par de pasos hacia atrás y ... Bueno, creo que son suficientes analogías. =)
Además, muchos libros sobre algoritmos y estructuras de datos utilizan pseudocódigo similar a Algol / Pascal y será fácil convertir ejemplos en estos lenguajes. Y puede utilizar directamente ejemplos del libro "Algoritmos y estructuras de datos" de Wirth. Edición de Oberon (2004), PDF (1,2 MB).
Algunos enlaces adicionales:
fuente
"Si su única herramienta es un martillo, todos sus problemas tenderán a parecer clavos"
Aprenda al menos algunos idiomas.
Además, su elección depende de su propósito.
¿Pasatiempo? ¿Trabajo en el mundo de Windows? Familia Linux / UNIX?
Tipo de aplicaciones: empresarial versus científica; controladores de hardware o aplicaciones?
¿Aplicaciones de escritorio o aplicaciones web?
Tengo varias sugerencias para ti.
(a) definitivamente aprenda algo de J (gratis de jsoftware.com; sucesor de APL; tanto J como APL son creaciones de Ken Iverson, ganador de Turing ... El premio Turing es como el premio Nobel de informática).
(b) si está en el mundo de Windows, comience con c # porque gran parte de .NET se ejecuta en c #. Si puede, obtenga una copia de "Inside c #" de Tom Archer de Microsoft Press. Puede obtener un sistema de desarrollo c # gratuito descargando la versión expresa de Microsoft.
(c) aprender a usar TDD / BDD ... independientemente del idioma, primero escribe una pequeña prueba llamada prueba de unidad; a continuación, escribe el código de producción para pasar la prueba unitaria; un pequeño paso a la vez ... no es solo el lenguaje que utiliza, también es la metodología.
(d) aprender algo de lenguaje ensamblador ... ensamblador es de bajo nivel, casi lenguaje de máquina, le dará una buena comprensión de lo que está sucediendo detrás de escena.
(e) fuera del mundo de Windows, recomendaría c ++.
No existe el mejor idioma.
Si solo se tratara de lenguaje, la programación sería más fácil.
No solo desea aprender algoritmos que son muy específicos, sino que también desea aprender patrones que son más generales y pueden ayudarlo a seleccionar el enfoque para resolver un problema dado.
Una cosa es segura: es probable que nunca te quedes sin cosas que aprender si vas a convertirte en programador.
fuente
Puede apreciar un lenguaje con tipos de datos algebraicos y coincidencia de patrones como Standard ML, OCaml, F # o Haskell. Por ejemplo, aquí hay una función para reequilibrar un árbol de búsqueda binario rojo-negro escrito en OCaml / F #:
fuente
Creo que vale la pena investigar Lisp.
Mi primer curso de programación universitaria fue en Lisp. Antes de eso, había estado escribiendo programas en varios idiomas durante 10 años. Pensé que el primer curso de programación sería aburrido, pero me equivoqué.
Lisp es un lenguaje muy interesante porque tiene una sintaxis muy simple. El enfoque cambia de la sintaxis a la funcionalidad. El estilo de programación funcional también es algo muy valioso para aprender. Después de mi curso de Lisp, me encontré escribiendo programas en C ++ de una manera completamente nueva y mejor, gracias a los nuevos conceptos que Lisp me había enseñado.
Lisp también usa la misma representación para el código y los datos, lo que se abre a un interesante diseño de algoritmos con código generado sobre la marcha y luego ejecutado.
fuente
Puede que me equivoque, pero ¿las estructuras de datos y los algoritmos no son independientes de los lenguajes de programación?
Al final, las estructuras de datos son solo una forma de organizar los datos; cualquier idioma de alto nivel lo apoyará. Por supuesto, ciertos lenguajes tendrán mecanismos que implementan estructuras de datos básicas (como Collections Framework en Java o C ++ STL), pero esto no le impide programar la estructura de datos en el lenguaje de programación que elija. Además, los algoritmos están escritos en pseudocódigo, lo que los hace independientes del lenguaje.
Me doy cuenta de que en realidad no responde a su pregunta, pero me cuesta entender lo que está buscando; aprender estructuras de datos / algoritmos o aprender un nuevo idioma.
fuente
Cualquier lenguaje excepto el feo C ++ debería funcionar bien.
fuente
Prefiero C ++ :)
fuente