2012-06-14 10 views
8

Así que para el verano decidí que también podría comenzar a aprender algoritmos antes de que comiencen las clases. Me han dicho que la clase tiene un ritmo bastante rápido, y que los algoritmos no son algo que deba tomarse a la ligera (tengo una tendencia a hacer esto con todo el trabajo del curso durante el semestre jajaja).Enfoque para aprender algoritmos usando un lenguaje específico

El libro que vamos a utilizar es este Algorithms (4th Edition). De todos modos, este es mi problema.

Estoy casi en la tercera posición del libro, pero me di cuenta de lo que estaba haciendo. Por ejemplo, leería y volvería a leer las secciones que no entiendo del todo. Entonces, si me siento lo suficientemente seguro, trataría de reproducir el mismo algoritmo en Java de mi cabeza. Pero al hacer esto, mi código se ve casi exactamente como los del libro ... en Java.

No puedo decir que solo estoy memorizando código tras código, entiendo los conceptos y me ayudan a codificar estos algoritmos, pero creo que solo podré implementar estos algoritmos en Java. Debo señalar que solo conozco Java en este momento.

tldr: Estoy aprendiendo los algoritmos como si estuviera aprendiendo a tocar la guitarra - repetición tras repetición. Pero al hacerlo, siento que estoy más obsesionado con que solo podré implementar estos en Java. ¿Cómo aprendería exactamente los algoritmos si el libro que está utilizando es específico del idioma?

Gracias de antemano.

+0

Los escribiría en cualquier idioma que use el libro. Entonces podría escribirlos en otra cosa. O viceversa. –

+1

A menos que planee escribir algo de Haskell o Perl en un futuro cercano, no me preocupe. La mayoría de los lenguajes de programación no son tan diferentes, y la mayoría comparte un conjunto básico de características universales (aunque la sintaxis y la visión del mundo tienden a cambiar). Una vez que tenga experiencia, podrá elegir nuevos idiomas como pelusa. En este momento, concéntrese en los conceptos reales de los algoritmos en lugar de en el idioma que usa para escribirlos. – Miguel

+0

No está disponible hasta el 25 de junio, pero puede encontrar que [este curso de algoritmos Udacity] (http://www.udacity.com/overview/Course/cs215) es útil. – Moses

Respuesta

9

no confunda usted mismo

Estás estudiando Java, por lo que escribir en Java. Especialmente si Java es su primer idioma. No se confunda por ahora, ya que está tratando de aprender 2 cosas a la vez: cómo programar en Java, y cómo programar. Estás aprendiendo un nuevo idioma y una forma de pensar. No haga demasiado, pero agregue otro idioma a la salsa por ahora.

Diversificar

Más adelante, o si se siente lo suficientemente seguro de que puede tener en otro idioma al mismo tiempo, entonces es obvio que sería beneficioso para aprender otro y tratar de replicar los algoritmos sin mirar el libro.

reproducen y se extienden

Lo que podríamos recomendamos que es la búsqueda de derivados de los algoritmos. Variantes conocidas, que han sido documentadas, y donde puede simplemente leer la descripción de la variante para que pueda intentar implementarla desde la versión "base", sin necesidad de leer el libro.

Por ejemplo, si su libro lo introdujo en una lista vinculada, debería poder encontrar el algoritmo para una lista doblemente enlazada o una lista circular enlazada sin leer más que una descripción del resultado deseado. O hay algo sobre los conceptos originales que claramente malentendiste.

probar primero, Lee-On Más tarde

me gustaría recomendar que en realidad incluso tratar de aplicar los algoritmos descritos en su libro antes de que ellas muestran a usted. El punto de vista del algoritmo de Sedgewick es ver una implementación canónica, que se considera un modelo estándar.Si acaba de leer la sección que conduce a la implementación (que con suerte se muestra primero), simplemente siéntese con el libro y trate de descubrir cómo podría hacerlo. Si no puede hacer eso en absoluto, entonces está demasiado adelantado en su libro y debe retroceder y comenzar de nuevo desde cero.

+0

Gracias, realmente me gusta la idea de intentar implementar antes de ver el ejemplo en el libro. – user1164937

+0

@ user1164937: cuando estudié, básicamente nunca se nos mostró una implementación, solo estábamos codificando todo el tiempo y cuando estábamos bloqueados le preguntábamos a los asistentes (que el 99% de las veces venían, leían nuestro código, se reían, preguntaban qué era mal o lo que no entendimos, y terminan diciéndonos "RTFM". Y aunque eso es duro, ese es un enfoque bastante bueno.) La única vez que vimos una implementación fue cuando teníamos una conferencia grupal y ellos proyectaban su editor en pantalla mientras tipea el programa en vivo. Tomar notas no estaba prohibido, pero se aconseja no hacerlo. Los libros fueron mal vistos durante al principio. – haylem

+0

@ user1164937: y de nada, me alegra que te ayude. Envíenos una nota más adelante si llegó a donde quería basado en eso :) – haylem

0

No dice qué tan bien conoce las matemáticas detrás de los algoritmos. Esa será la clave para determinar su instalación con el código.

Los libros de Sedgewick son muy buenos. Me sentiría libre de elegir algunos y ver otros libros también, como "Recetas numéricas" y "Métodos numéricos que funcionan". Vea si otro punto de vista puede aclararle.

Si no siente que está obteniendo suficiente de la copia de Java, vea si puede traducirlos a otro idioma, tal vez Python o una alternativa puramente funcional. Si puedes hacer eso, sabrás que lo tienes.

0

Yo trataría de aprender otro idioma para verificar que realmente puedes portarlo a otro idioma (el javascript sería mi voto porque es simple y útil en el frente y el backend) o escribir los algoritmos en pseudocódigo ya que es más independiente del lenguaje La mayoría de los idiomas tendrán el código muy similar. Lo único que debe tener mucho cuidado es cuando confía en algún aspecto del lenguaje (como genéricos o iteradores en java) que no podrá usar en otro idioma y que podría dejar un espacio en su comprensión.

Otra forma de verificar que realmente comprenda el algoritmo es realizar pequeños cambios en el problema y asegurarse de que puede ajustar el algoritmo para que funcione. Por ejemplo, si se trata de un algoritmo de clasificación, intente ordenar por varios atributos diferentes en vez de uno solo, si se trata de un algoritmo de gráficos, haga que el gráfico sea un dígrafo y vea cómo deberían cambiar las cosas.

2

Una cosa sobre los algoritmos, son esencialmente independientes del idioma. Realmente no hay nada que te impida hacer los ejemplos de Sedgewick en C, Python u otro idioma.

Si realmente no conoce otros idiomas, concéntrese en Java. Claro, es un poco repetitivo, pero esos bits se te pegarán en la cabeza en el buen sentido y llegarán los tiempos de prueba, estarás contento por la información.

Estás en una posición interesante en este momento, ya que el tipo de pensamiento requerido para escribir programas es muy diferente del pensamiento normal. Agregue a eso el hecho de que está aprendiendo un lenguaje completamente nuevo con una sintaxis, puntuación diferente y similares. La práctica realmente es perfecta, ya que hay muchas partes y piezas para recordar.

Ah, si quieres practicar con algoritmos, prueba project euler, code kata y otros sitios de desafío. Estos pequeños desafíos pueden ayudarlo a familiarizarse con el idioma y a sentirse cómodo con el tipo de pensamiento requerido.

1

En primer lugar, felicidades por dar los primeros pasos para aprender a programar. Diría que ya estás por delante de tus compañeros al comenzar a mirar hacia adelante durante el verano.

Por lo que teme que solo pueda implementar algoritmos en Java, ya ha demostrado que no será un problema para usted. Parece que eres lo suficientemente apasionado como para comenzar temprano, por lo que no deberías tener problemas para implementar una solución en varios idiomas. Además, la mayoría de los lenguajes con C/C++ (Java y C# para nombrar algunos) como la sintaxis serán lo suficientemente similares como para poder traducir su conocimiento sin problemas.

¡El mejor consejo que puedo dar es CÓDIGO, CÓDIGO, CÓDIGO! No solo lea sobre los algoritmos que realmente los implementan.

0

estoy algoritmos de aprendizaje como si yo estoy aprendiendo a tocar la guitarra - repetición tras repetición.

Entonces no está aprendiendo los algoritmos. Estás aprendiendo la repetición. Dos cosas diferentes El uso de un lenguaje de programación por un libro de algoritmos es un factor secundario. Es solo un vehículo de instrucción, un detalle de implementación.

Lo que debería concentrarse es en la comprensión de la estructura, lógica y características matemáticas de un algoritmo (y posiblemente la estructura (s) de datos asociada a ella.)

Eso es lo que debería ser su objetivo.

Pero al hacerlo me siento como si estuviera más obsesionado con que solo voy a poder para implementar estos en java.

Pero eso se debe a que se está centrando en cómo se está codificando el algoritmo (en Java en este caso particular). Se está centrando en un detalle de implementación.

Cuando aprende a conducir, no se centra en cómo aprende a conducir un Honda Civic o un Nissan Maxima. Aprenderá la esencia de lo que es conducir, las reglas generales, las precauciones necesarias y las leyes que rigen la conducción de un vehículo.

Lo mismo con los algoritmos de aprendizaje. No aprende "Algoritmos en Java" no más que "Algoritmos en Haskell". Primero aprendes Algoritmos, el vehículo (sin casos muy especializados) es secundario.

Usted debe centrarse en lo que el algoritmo hace, cómo y por eso . Preguntas como "¿cómo/por qué funciona?" y lo más importante * "¿cuáles son las características de rendimiento?", Esas son las cosas en las que debería centrarse.

Todos los buenos libros de algoritmos (incluidos de Sedgewick) llevan ese mensaje. En eso deberías enfocarte. Cómo llegas a ese nuevo enfoque, eso es una función de las estrategias personales de aprendizaje.

¿Cómo aprendería exactamente los algoritmos si el libro que está utilizando es específico del idioma?

Al no enfocar el idioma. Céntrese en la estructura, concéntrese en las estructuras de datos involucradas, las invariantes, las precondiciones y las postcondiciones. Comprender el comportamiento asintótico descrito en Big-O (o Big-Omicron), Little-O/Little-Omicron y Omega.

Estás aprendiendo algoritmos, no programando en Java a través de algoritmos de codificación.

Si no puede hacer este salto mental, significa que no tiene suficiente práctica o análisis abstracto. No es un insulto, sino una observación y un consejo. Codificación, el uso de un lenguaje de programación es típicamente secundario al análisis matemático de la informática, el enfoque de la Informática (de la cual los algoritmos forman parte).)

NOTA que he hecho en Java para más de 10 años, y aunque me gusta para el trabajo, creo firmemente que es una pobre herramienta para el aprendizaje de temas de programación o CS.

Uno es mejor servido aprendiendo Algoritmos con A) un lenguaje de programación a nivel de sistemas de procedimiento como C o Ada, o un simulador de pseudo ensamblador de alto nivel, o B) un lenguaje funcional como Lisp o Haskell.

Las características orientadas a objetos en los lenguajes OO puros/pseudo puros simplemente se interponen en el camino.

Los algoritmos son estructuras matemáticas con una naturaleza descriptiva de cómo (operacionalmente) y/o qué (matemáticamente). El primero es perfectamente adecuado para la programación de procedimientos, el más tarde para la programación funcional.

+0

Supongo que la analogía fue pobre de mi parte, pero lo que quise decir es que intento comprender los conceptos. Vuelva a leer si tengo que hacerlo (he vuelto a leer algunas secciones hasta que haga clic). Además de "poner a prueba mi conocimiento", lo que hago al implementarlo en Java, ya que Java es el único idioma que conozco. Incluso si termino de implementarlo correctamente la primera vez, lo vuelvo a hacer porque realmente quiero que sea algo a largo plazo. – user1164937

+0

Además, estoy interesado en Haskell. Mucho cuando estaba pensando en un segundo idioma. Tengo la idea de que un lenguaje funcional no dolería ya que escuché que es un parque de béisbol totalmente diferente, por lo que no me confundiría con java (solo tengo la experiencia de un semestre). ¿Qué piensas? – user1164937

+0

"¿Qué piensas?" -- atención. OMI, si solo conoce un idioma (Java), creo que se está haciendo un mal servicio a sí mismo aprendiendo algoritmos sin tener una exposición diversificada a otros idiomas. Salvo los algoritmos de aprendizaje naturalmente dotados (pero realmente, realmente, realmente aprendiéndolos) requiere que el estudiante tenga una cierta cantidad de práctica de programación (idealmente en varios idiomas). Debería poder escribir programas de complejidad semi-decente en, digamos, Java, C y Python (por ejemplo) antes de involucrarse en algoritmos de aprendizaje. OMI, es como aprender Cálculo sin Algebra. –

Cuestiones relacionadas