¿Cuál es el lenguaje más simple para aprender algoritmos y estructuras de datos?

El “lenguaje más simple para aprender algoritmos y estructuras de datos” es casi seguro el Esquema (http://en.wikipedia.org/wiki/Sch…). También es una muy buena opción para ejercicios en algoritmos y estructuras de datos.

Lo alienta a pensar de manera funcional, y proporciona un lenguaje general muy simple, poderoso para razonar sobre programas y datos. Le permite actualizar las referencias de forma imperativa, pero hace que esas actualizaciones sean muy explícitas. Ambas características lo ayudarán a ver la forma y la estructura del problema en el que está trabajando, en lugar de los detalles de la implementación de su solución.

Esto será más difícil y más lento al principio que muchos otros enfoques, pero vale la pena el esfuerzo. Intente comenzar con Estructura e interpretación de programas de computadora (http://mitpress.mit.edu/sicp/) si aún no es un programador experimentado: es gratis en línea y es un clásico. Hay buenos videos, si están fechados, de las conferencias originales disponibles también: http://groups.csail.mit.edu/mac/….

Si ya eres un programador experimentado, también te animo a que consideres OCaml, pero definitivamente no es “simple”. La sintaxis es pesada, el sistema de módulos es complicado y el tipeo estático fuerte le dará problemas a los principiantes. Pero esas mismas cosas son poderosas herramientas de ingeniería que le permitirán expresar grandes combinaciones de algoritmos y estructuras de datos de manera clara y correcta.

No recomendaría ninguno de estos idiomas que otros mencionan, por las siguientes razones:

  • Python: es un lenguaje terrible para el CS académico, incluso peor que Perl (que tampoco recomiendo). Vea la respuesta de Jesse Tov aquí: ¿Cuáles son las principales debilidades de Python como lenguaje de programación?
  • C: la gestión manual de la memoria y el toque inseguro del puntero te dejarán pasar la mayor parte de tu tiempo luchando contra el idioma, no aprendiendo. Y estará mucho menos seguro si sus implementaciones son realmente correctas. Sin mencionar las capacidades muy limitadas del lenguaje en sí.
  • Haskell: Me encanta el haskell en pedazos, pero la falta de actualizaciones obligatorias significa que tendrá que adoptar un enfoque de aprendizaje muy diferente, y la mayoría de los recursos clásicos para algoritmos y estructuras de datos serán muy difíciles de seguir. El sistema de tipos y la pereza también serán obstáculos innecesarios para un principiante. Dicho esto, hacer el mismo trabajo la segunda vez en Haskell podría ser muy divertido.
  • Java: es lento para escribir, no muy expresivo, y te encierra en una cosmovisión incómoda orientada a objetos. Simplemente no es divertido.

La respuesta a esta pregunta depende exactamente de lo que quieres 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 un ejercicio de aprendizaje, pero puede encontrar 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 tipo 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 generalmente no serán aparentes hasta el tiempo de ejecución.

do

C está en el otro extremo. Es bueno si desea aprender detalles realmente de bajo nivel, como cómo se administra 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 simplemente vale la pena señalar.

C ++

C ++ ha sido mencionado. 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

Java también ha sido mencionado. A muchas personas les gusta odiar a 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 está estáticamente tipado y tiene recolección de basura. Esto significa que el compilador de Java detectará muchos errores que los lenguajes tipados dinámicamente no detectarán (hasta el tiempo de ejecución) y no hay que lidiar con fallas de segmentación (lo que no quiere decir que no pueda perder memoria en Java; obviamente, sí puede). Creo que Java es una buena opció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 (recolección 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, tiene los lenguajes funcionales: Haskell, OCaml, Scheme / Lisp, Clojure, F #, etc. Estos piensan en todos los problemas de una manera muy diferente y vale la pena aprender en algún momento, pero nuevamente se reduce a lo que desea aprender: programación funcional o estructuras de datos? Me apegaría a aprender una cosa a la vez en lugar de confundir el tema. Si aprende un lenguaje funcional en algún momento (lo cual recomendaría), Haskell es una opción segura y excelente.

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 #) 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 mismo escriba, aprenderá básicamente lo mismo que aprendería en C / C ++ pero sin tener que administrar la memoria.

Permítanme explicar: una tabla hash extensible necesita ser redimensionada si se agregan elementos suficientes. 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 en los elementos existentes. La implementación es básicamente la misma en todos los lenguajes imperativos, pero en C / C ++ debe 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 opción (y muy cerca de las otras dos) solo porque la escritura dinámica podría ser problemática al principio.

Fuente : Elección del lenguaje de programación para el aprendizaje de estructuras de datos y algoritmos.

C ++ es demasiado molesto para aprender algo, excepto cómo escribir código C ++. Si desea acercarse a los algoritmos metálicos y las estructuras de datos (pilas, colas, listas vinculadas, tablas hash), nada supera la dificultad de implementarlos en el viejo C. Los programadores profesionales usan bibliotecas para hacer todo ese bajo nivel, y la mayoría de las computadoras modernas Las aplicaciones utilizan un pequeño subconjunto de las estructuras de datos disponibles (las matrices y las tablas hash son las más comunes)

Si está interesado en algoritmos puros y estructuras de datos, Lisp es un excelente lenguaje para aprender porque es sintácticamente puro. Desafortunadamente, no está de moda, así que aprenderlo no te dará trabajo.

Solo he incursionado en Python, pero escucho de personas a las que respeto que es un lenguaje muy sólido y muy indulgente. Pienso que usar sangrías para definir cierres es bastante extraño, pero eso solo habla mal.

Si desea encontrar un trabajo, entonces JavaScript es el único camino a seguir. Solía ​​relegarse al gueto del entorno limitado del navegador, pero hoy en día hay más y más marcos de JavaScript de pila completa y puede escribir código de fuerza industrial real sin la falta de coincidencia de impedancia de la intermediación desde Java o C # en el servidor y JavaScript en el cliente.

El mayor problema con JavaScript es que hasta hace poco era muy complicado. Para su propósito declarado de aprender estructuras de datos y algoritmos, son 3/5 estrellas. Afortunadamente, JSON es lo suficientemente simple y robusto como para moverse por cualquier estructura de datos que necesite para una aplicación moderna. A menos que vaya a escribir compiladores o aplicaciones de alto rendimiento muy especializadas, JavaScript es una excelente introducción a los lenguajes tipo C.

Utilizo Python para todo en la vida real, pero me alegra que me hayan enseñado estructuras de datos usando C. Mi maestro de estructuras de datos nos hizo implementar todas las estructuras de datos centrales (tabla hash, lista vinculada, árbol de búsqueda binaria) para nosotros mismos en C utilizando estructuras y punteros. No puedo imaginarme entenderlos tan bien usando un lenguaje como Python o Java donde se le entregan implementaciones listas para comenzar.

Para algoritmos, sí, Python es genial. Pero realmente debería implementar todas las estructuras de datos fundamentales usted mismo, de la manera que Dios pretendía que lo hiciera.

C puede no ser el lenguaje más simple para aprender (debido a los desafíos de los punteros y el manejo manual de la memoria), pero no puedo enfatizar lo gratificante que he encontrado al usarlo para aprender estructuras de datos.

El lenguaje te obliga a trabajar con los huesos básicos de tu máquina. En C, usted es responsable de unir eficazmente las estructuras de datos de los bytes sin procesar de la memoria. Si no tiene cuidado, podría causar errores graves (así que tenga a mano una buena herramienta de depuración / entorno). Creo que programar en C te hace apreciar mucho más tu código. Al final, desarrollas una comprensión muy profunda de las estructuras de datos que construiste, ya que prácticamente no hay mano. Puede que no sea fácil, pero seguro que es efectivo.

Como dijo Einstein: “Cualquier tonto puede saber. El punto es entender”.

No existe el mejor lenguaje para aprender estructuras de datos. Ciertamente, puede abordar DS y Algoritmos desde un punto de vista completamente teórico (en última instancia, los Algoritmos y DS son matemáticas) y utilizar un buen seudocódigo.

El idioma que usa es más una cuestión de preferencia y, al final del día, el conocimiento que adquiere puede extrapolarse a cualquier idioma que desee, una vez que haya dominado los conceptos básicos. Siguiendo esta línea de pensamiento, le recomendaría que use C ++ dado que ya tiene cierto nivel de familiaridad con él.

Ahora, si desea aprovechar esta oportunidad para aprender un nuevo idioma también, debe elegir algo que no interfiera demasiado con su objetivo real (aprender DSA) y, para este fin, definitivamente recomendaría un lenguaje como Python que requiere poco o nada innecesario repetitivo.

C. Considerando que la mayoría de los sistemas operativos tienen sus raíces en C, es un buen lenguaje aprender estructuras de datos y algoritmos. Es un lenguaje de bajo nivel con pocas construcciones básicas para dominar y el lenguaje en sí mismo no obstaculiza el aprendizaje de algoritmos o estructuras de datos.

  • Para algoritmos: python (debido a la disponibilidad de estructuras de datos preimplementadas y, además, los gráficos se pueden implementar fácilmente en python usando el diccionario ).
    Cursos como Udacity | Cursos en línea gratuitos, avance su educación y carrera universitaria también prefiere python para implementar algoritmos.
  • Para estructuras de datos: C (porque las estructuras de datos como árboles, gráficos, listas vinculadas, etc. tratan con punteros y C puede proporcionar una experiencia profunda con punteros)

En la universidad (York, Reino Unido), el módulo de algoritmos y estructuras de datos se enseñó utilizando Ada, pero desde entonces han cambiado a Java. Un lenguaje estrictamente tipado como Ada ayuda cuando se estudian algoritmos y estructuras de datos porque ayuda a evitar errores tontos y depuración cuando sale mal, pero también estoy de acuerdo con Lief en que la sintaxis para Python se parece mucho a un pseudocódigo y prácticamente es más rápido para la creación de prototipos pequeños programas

Pitón

Este es el por qué.
gráfico = {‘A’: [‘B’, ‘C’],
‘C’: [‘B’]}
Vea el artículo de Guido sobre lo fácil que es la transversal del gráfico.
http://www.python.org/doc/essays

Lo mismo debería aplicarse a otros lenguajes dinámicos ricos como Ruby.

Finalmente, desea escribir en C ++ o Java, tal vez incluso Javascript para el rendimiento.

Depende completamente de su área de confort. Pero me gustaría señalar aquí una cosa que si usa C / C ++ para aprender DS y Algoritmos, terminará teniendo mucho más conocimiento y claridad de las cosas. Sin duda, encontré C / C ++ un poco más complejo que Java.

Si desea aprender DS y Algo utilizando Java, le resultará bastante fácil porque hay muchas funcionalidades que Java implementó internamente, por lo que no necesita ocuparse de todas y cada una de las cosas. Pocos conceptos son como
recolección de basura, punteros, etc., todo esto implementado internamente por Java, por lo que le resultará un poco fácil de programar y podrá concentrarse más en sus algoritmos.
Java también proporciona un marco de recopilación que ya ha implementado muchas estructuras de datos, por lo que si está implementando un algoritmo particular que utiliza ciertas estructuras de datos internamente, no hay necesidad de implementarlas. puede usar las pilas, colas, listas enlazadas pre implementadas creadas por Java y lo bueno de ellas es que son bastante eficientes.

Finalmente, Java es un poco fácil de aprender e implementar problemas de DS y Algo, mientras que C / C ++ es más tedioso, pero C / C ++ te da más claridad.

Mi voto es Python. La sobrecarga es mínima, pero hay más libros disponibles para Java. De cualquier manera, ambos no están tan hinchados como C ++.

Si hace JavaScript como sugieren algunas personas, comprenda que no obtendrá los mismos resultados debido a la forma en que se definen los tipos de JavaScript.

Depende del interés del individuo. Digamos que te sientes más cómodo con c que con java, o con python que con c ++. Así que elige el idioma que te guste.

Como opinión personal, sugeriría usar c o c ++ porque son rápidos, fáciles de aprender, ampliamente utilizados y admiten punteros.

Creo que Haskell también es un buen lenguaje para este propósito. Encontré Algorithms: A Functional Programming Approach muy útil (amazon link-> http://amzn.to/hajMgq )

Si elige Python, le recomiendo el libro de Magnus Lie Hetland, Algoritmos de Python: Dominar algoritmos en el lenguaje Python (enlace de Amazon -> http://amzn.to/froxVX ). Es muy legible y fácil de seguir. Hetland escribió un excelente libro sobre Python antes de este.

En ingeniería informática, aprendimos C y lo usamos como lenguaje primario para implementar estructuras de datos y algoritmos. Utilizamos C para hacer la programación del socket.

Al final del día, lo importante es que comprenda las estructuras de datos y los algoritmos y sepa cómo implementar algunos de ellos o la mayoría de ellos.

Puede usar C ++, Java, C # o cualquier otro que no pueda salir mal.

Si tiene una compañía específica en mente para trabajar, averigüe qué idiomas usan y use eso en su práctica para que pueda impresionarlos en la entrevista.

¡Buena suerte!

Yo elegiría cualquier lenguaje de programación funcional. Son más expresivos y más algorítmicos cuando se trata con diferentes tipos de problemas. Y debido a la inmutabilidad y al enfoque matemático, terminarás con más algoritmos científicos. Comience con Scheme, que es muy fácil de aprender.

Creo que las opciones comunes son C ++, Java y Python para esto. No puedo hablar con el tercero, pero recomendaría los dos primeros. Solía ​​ser que Java tenía clases de colecciones más fáciles de usar (útil para aprender cosas como la mejor primera búsqueda), pero Boost puede haber cambiado eso.

Editar: en respuesta a la pregunta movida, el hecho de que sepa que C ++ supera cualquier desventaja que tenga como lenguaje. El mayor problema con el aprendizaje de estructuras de datos en C ++ es que pasará su tiempo persiguiendo la corrupción de la memoria. Pero si ya sabe cómo evitar problemas con el puntero, las estructuras de datos en C ++ no son tan diferentes de las estructuras de datos en Java.

No estoy seguro de lo que significa “simple”, pero para los matemáticamente inclinados recomiendo probar SETL (SET Language), que se desarrolló en NYU y donde lo usé. Muchos de sus conceptos ahora están disponibles en muchos lenguajes “modernos y ágiles” (python), pero en ese momento pensé que era muy poderoso. Para un ejemplo rápido de wikipedia, esto imprime todos los números primos del 2 al N.
print([n in [2..N] | forall m in {2..n - 1} | n mod m > 0]);

Mientras sus conceptos sean claros, realmente no necesita preocuparse por el lenguaje en el que lo aprende. Creo que C ++ es la mejor opción para aprender y practicar estructuras de datos. Elegir C ++ brinda un mejor control de la memoria.

Me enseñaron la estructura de datos usando el lenguaje Java. En mi opinión, el mejor lenguaje para aprender la estructura de datos es el que hace explícito si el acceso es aleatorio o secuencial. C y C ++ tienen puntero, Java tiene referencia. Entonces son buenos candidatos.

More Interesting

¿Cuál es la diferencia entre árboles binarios completos y completos?

¿Qué es el desaprendizaje en el algoritmo de aprendizaje automático?

¿Qué idioma es mejor para comprender la importancia de las estructuras de datos?

¿Cuál es el mejor algoritmo para implementar la función next_permutation sin STL?

La mayoría de las definiciones / teoremas / ejemplos de privacidad diferencial que he encontrado son para consultas que devuelven un solo número por columna, como un promedio. ¿Existen mecanismos diferencialmente privados para otros tipos de consultas, como los que subconjustan filas en función de algún criterio?

¿Cuáles son los mejores cursos en línea para estructuras de datos y algoritmos (deben enfatizar más en escribir código)?

¿En cuánto tiempo puedo ser un profesional en la resolución de problemas en algoritmos y estructuras de datos si empiezo hoy sin ningún conocimiento previo?

¿Cuáles son los algoritmos de detección de spam social de última generación?

¿Necesito conocer algoritmos de aprendizaje automático para asegurar un trabajo como analista de datos?

¿Cómo se pueden usar los bucles para procesar matrices?

¿Cuál es el método computacionalmente más eficiente para agregar todos los elementos de una matriz (o matriz)?

¿Existe un libro que enseñe algoritmos, estructuras de datos y otros conceptos básicos de informática de una manera divertida?

Cómo resolver esta recurrencia T (n) = T (sqrt (n)) + log_2 n

Cómo hacer que los algoritmos sean eficientes

¿Usar un tipo de inserción de 50 elementos tendrá el mismo tiempo de ejecución que usar un tipo de inserción de 10 elementos 5 veces?