algorithm - sirve - que es programacion en informatica
Elección del lenguaje de programación para aprender estructuras de datos y algoritmos (14)
¿Qué lenguaje de programación recomendaría para aprender sobre estructuras de datos y algoritmos ?
Considerando lo siguiente:
- Experiencia personal
- Características del lenguaje (punteros, OO, etc.)
- Idoneidad para aprender conceptos de DS & A
Lo pregunto porque hay algunos libros que son independientes del lenguaje de programación (escritos desde una perspectiva Matemática, y usan pseudocódigos). 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 presentan conceptos de DS & A con ejemplos escritos en un lenguaje de programación particular, y me gustaría codificar estos algoritmos también, por lo tanto, hasta cierto punto, el lenguaje también escoge el libro.
De cualquier manera, tengo que elegir un idioma, y preferiría quedarme con uno en todas partes. Dejando de lado las preferencias de idioma personal, ¿cuál es el mejor para este propósito?
"Si tu única herramienta es un martillo, entonces todos tus problemas tenderán a parecerse a las uñas"
Aprende al menos algunos idiomas.
Además, su elección depende de su propósito.
¿Hobby? ¿Trabajo en el mundo de Windows? Familia Linux / UNIX?
Tipo de aplicaciones: comercial versus científica; controladores de hardware o aplicaciones?
Aplicaciones de escritorio o aplicaciones web?
Tengo varias sugerencias para ti.
(a) definitivamente aprende algo de J (sin jsoftware.com; sucesor de APL; J y APL son creaciones de Ken Iverson, ganador de Turing ... El premio Turing es como el premio Nobel en informática).
(b) si está en el mundo de Windows, comience con c # porque tanto en .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 de c # gratis descargando la versión expresa de Microsoft.
(c) aprender a usar TDD / BDD ... independientemente del idioma, primero se escribe una pequeña prueba llamada prueba unitaria; luego, 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 usa, sino también la metodología.
(d) aprenda algún lenguaje de 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 hay mejor lenguaje
Si se tratara solo de lenguaje, la programación sería más fácil.
No solo quiere aprender algoritmos que son muy específicos, también quiere aprender patrones que son más generales y pueden ayudarle a seleccionar el enfoque para resolver un problema determinado.
Una cosa es cierta: es probable que nunca se quede sin cosas para aprender si se convertirá en un programador.
Creo que vale la pena investigar a 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 estaba equivocado.
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 extremadamente valioso de 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 código y datos, que se abre para un diseño de algoritmo interesante con código generado sobre la marcha y luego ejecutado.
Cualquier lenguaje, excepto el frágil C ++, debería funcionar bien.
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. Te obligará a entender los punteros, la asignación dinámica de memoria y las implementaciones detrás de las populares estructuras de datos como listas enlazadas, tablas hash, etc. Muchas de ellas son cosas que puedes dar por sentado en lenguajes de nivel superior (Java, C #, etc. )
La respuesta a esta pregunta depende exactamente de lo que quiere aprender.
Python y Ruby
Los lenguajes de alto nivel como Python y Ruby a menudo se sugieren 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 puede descubrir que está creando 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 idiomas tipados dinámicamente. 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 aparentes hasta el tiempo de ejecución.
do
C está en el otro extremo. Es bueno si desea aprender detalles de bajo nivel, como la administración de la memoria, pero la administración de la memoria es de repente una consideración importante, como en el uso correcto de malloc () / free (). Eso puede ser una distracción. Además, C no está orientado a objetos. Eso no es algo malo, pero vale la pena señalarlo.
C ++
C ++ ha sido mencionado. Como dije en el comentario, creo que esta es una elección terrible . C ++ es terriblemente complicado incluso en el uso simple y tiene una cantidad ridícula de "errores". 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
Java también ha sido mencionado. A muchas personas les gusta odiar a Java y es cierto que el lenguaje es extremadamente detallado y le faltan algunas de las características más modernas del lenguaje (por ejemplo, cierres) pero nada de eso realmente importa. Java está tipado estáticamente y tiene recolección de basura. Esto significa que el compilador de Java detectará muchos errores que los lenguajes de tipeo dinámico no tendrán (hasta el tiempo de ejecución) y no habrá fallas de segmentación (lo cual no quiere decir que no se pueda perder memoria en Java; obviamente se puede). Creo que Java es una buena elección.
DO#
C # el lenguaje es como una versión más moderna de Java. Al igual que Java, es un lenguaje compilado intermedio administrado (recogido de basura) que se ejecuta en una máquina virtual. Todos los demás idiomas 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 bytecode.
C # tiene los mismos pros y contras que Java, básicamente.
Haskell (etc.)
Por último, tienes los lenguajes funcionales: Haskell, OCaml, Scheme / Lisp, Clojure, F #, etc. Estos piensan sobre todos los problemas de una manera muy diferente y vale la pena aprenderlos en algún momento, pero nuevamente se trata de 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 problema. Si aprendes un lenguaje funcional en algún momento (que recomendaría), Haskell es una buena opción.
Mi consejo
Elija Java o C #. Ambos tienen IDEs gratuitos y excelentes (Eclipse, Netbeans e IntelliJ Community Edition para Java, Visual Studio Express para C #, Visual Studio Community Edition) que hacen que escribir y ejecutar código sea muy fácil. Si no utiliza una estructura de datos nativa más compleja que una matriz y cualquier objeto que usted escriba, aprenderá básicamente lo mismo que haría en C / C ++, pero sin tener que administrar realmente la memoria.
Permítanme explicar: una tabla hash extensible debe redimensionarse si se agregan suficientes elementos. En cualquier implementación, eso significará hacer algo así como duplicar el tamaño de la estructura de datos de respaldo (normalmente una matriz) y copiar en los elementos existentes. La implementación es básicamente la misma en todos los lenguajes imperativos, pero en C / C ++ tiene que lidiar con fallas de segmentación cuando no asigna o desasigna algo correctamente.
Python o Ruby (en realidad no importa cuál) sería mi próxima elección (y muy cercana a las otras dos) solo porque la tipificación dinámica podría ser problemática al principio.
Prefiero C ++ :)
Puede apreciar un lenguaje con tipos de datos algebraicos y patrones coincidentes como ML estándar, 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 #:
let balance = function
| R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
| a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
R(B(a, x, b), y, B(c, z, d))
| a, x, b -> B(a, x, b)
Puedo estar equivocado, 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 lenguaje de alto nivel lo apoyará. Claro, ciertos lenguajes tendrán mecanismos que implementan estructuras de datos básicas (como el Framework de Colecciones en Java o STL de C ++), pero esto no le impide programar la estructura de datos en el lenguaje de programación de su elección. Además, los algoritmos están escritos en pseudocódigo, haciéndolos independientes del lenguaje.
Me doy cuenta de que realmente no responde tu pregunta, pero tengo problemas para entender lo que estás buscando; aprender estructuras de datos / algoritmos o aprender un nuevo idioma.
Si el propósito es solo aprender sobre estructuras de datos y algoritmos , diría que es JavaScript. Puede ejecutar su código en un navegador. Tiene un manejo de objetos muy flexible y puede enfocarse completamente en estructuras de datos y algoritmos y no en administración de memoria, construcciones de lenguaje u otras cosas que alejen el enfoque de la ciencia de la computación real que está aprendiendo.
La ventaja también es que puedes visualizar fácilmente varias estructuras de datos usando el navegador para representar gráficos y árboles usando DOM y Canvas.
Los cursos de CS a lo largo de los años tienden a cambiar el idioma en el que se enseña la asignatura, simplemente porque han llegado nuevas y mejores implementaciones de lenguajes que facilitan el aprendizaje, lo que hace que sea más fácil enfocarse en el problema real.
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 pueda aprender lo que sucede a nivel de la memoria; También me gustaría aprender algoritmos en un lenguaje funcional, para que pueda ver cómo los algoritmos similares funcionan 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 hardcore. 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 como mi lenguaje preferido para aprender algoritmos. Es un poco exagerado, sentiría.
EDITAR : también depende de con qué estés familiarizado. Si desea comenzar a trabajar con un texto de algoritmos en este momento, y nunca ha trabajado mucho con C, entonces Python es por mucho la respuesta correcta. Usted quiere que el lenguaje no sea un gran obstáculo que superar, porque desea disfrutarlo. Sé que lo hice.
Último punto: al menos cuando estaba aprendiendo algoritmos, pasé muchísimo tiempo trabajando en papel. Creo que eso es importante; quiero decir que quieres aprender sobre asintóticas, etc. Pasar todo tu tiempo implementando algoritmos en cualquier idioma no es lo que debes hacer.
Sugeriría Ada. Tiene características para construcciones de datos que no se encuentran en otros idiomas, como verificaciones de rango, type Day is range 1 .. 31;
También tiene una verificación de tiempo de compilación y de tiempo de ejecución muy estricta (a menos que elija desactivarla), lo que facilita la búsqueda de errores en su implementación.
Oberon-2 o Component Pascal . El último es un superconjunto del primero.
Einstein dijo una vez "Haz que sea lo más simple posible, pero no más simple". Esta frase fue elegida por el Prof. Niklaus Wirth como epígrafe del informe original del idioma Oberon. Y es cierto para los descendientes de Oberon 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 que ya no hay nada que llevar". . Wirth, incluso si no se logra esto, está en el camino correcto. En "Línea de lenguajes de programación de Wirth" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) cada lenguaje posterior es más simple y al mismo tiempo más poderoso que el anterior.
Lenguas poderosas pero simples siguiendo el principio de la menor sorpresa. Fuerte tipado estático, facilidades orientadas a objetos, recolección de basura. La lista de características no es grande, pero es suficiente para ser productivo y no complicar las cosas, especialmente en las etapas iniciales.
Cuando quieres aprender algoritmos y estructuras de datos, lo dices en serio. Pero si tu lenguaje es "poderoso" (tiene muchas características como C ++, C #, Java, Python, ...) perderás mucho tiempo aprendiendo lenguaje, no algoritmos y estructuras de datos. No verás el bosque por los árboles. =) Puede pensar en árboles como elementos de sintaxis (y cualquier otra característica) y de bosque como concepto importante (cualquier algoritmo, estructura de datos, puede ser OOP, lo que sea). Cuantas más características (árboles) tenga en su idioma, más complicado se convertirá en la tarea de dar un paso atrás y comprender los conceptos (para ver el bosque).
Pero si el lenguaje es realmente poderoso (tiene un conjunto pequeño de características bien probadas), el idioma en sí pasa al segundo lugar. No hay tantos árboles, así que puedes hacer 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 usan Algol / pseudocódigo similar a Pascal y será fácil convertir ejemplos en estos idiomas. Y puede usar directamente ejemplos del libro "Algorithms and Data Structures" de Wirth. Edición Oberon (2004), PDF (1.2 MB).
Algunos enlaces adicionales:
- El compilador Oxford Oberon-2 para Linux, Windows, Mac OS X.
- BlackBox Component Builder - entorno de desarrollo para Component Pascal. Solo Windows. Funciona bastante bien en Wine.
- Introducción al Diseño y Análisis de Algoritmos por Anany V. Levitin - mi libro favorito sobre algoritmos.
Python
es genial. Fácil de leer, con todas las funciones. Si vas a trabajar con pseudocódigo, Python te 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 e interactividad similar a la de un libro de texto que fomenta la experimentación " .
Python también trabaja de manera amigable para principiantes con Gato , una herramienta para hacer gráficas. Learning Algorithms and Data Structures es uno de los mejores que puede ayudar al hacerse visual, algo que Gato hace que sea fácil de hacer (sin aprender ninguna biblioteca de gráficos complejos)
Recomendaría Java
principalmente porque:
- recolección de basura
- referencias
- ricas colecciones
EDITAR: abajo votantes por favor explique.