2010-08-29 6 views
10

Antes que nada, lo siento, pero mi inglés no es muy bueno.¿Cómo resolver mis algoritmos de dificultad?

Estoy en el tercer semestre en un curso de programación y no puedo "obtenerlo".

Aprobé exámenes anteriores porque estudié tres veces más que mis colegas. Y, ahora en mi clase Data Structures cuando el profesor nos pide que hagamos algoritmos de lista (por ejemplo), mis colegas comienzan a escribir el código mientras yo (¿o sería "I"?), Incluso después de verlo hecho, puede " T entender

Me parece tan difícil que es doloroso. Me lleva 1 hora entender algoritmos simples.

Entonces la pregunta es: ¿alguien me puede recomendar libros o algo así, que me ayudará a pensar más como un programador? Quiero decir, las personas "normales", después de un problema determinado, parecen hacer de inmediato una imagen en su cabeza y una estrella para escribir el código.

+2

¿Se siente cómodo con un lenguaje de programación? Hay preguntas similares que flotan aquí en SO: http://stackoverflow.com/questions/259660/painless-analysis-of-algorithms-training y http://stackoverflow.com/questions/366418/how-to-get-started -en-algoritmos. Recomiendo MIT OCW. – dirkgently

+4

IMO debe hablar de esto con un maestro. – ChrisW

+0

Maldición, ustedes fueron demasiado serviciales, no esperaba mucho. Ahora no puedo decidir mi respuesta aceptada. – StudioWorks

Respuesta

6

Creo que hay dos formas de aprender a escribir algoritmos: 1. Pruébelo usted mismo (y luego revíselo con la respuesta "correcta"). Por supuesto, debes comenzar con los simples. 2. Implemente los algoritmos de otros (para codificar). Pasar de algoritmos a códigos y viceversa le da una gran "sensación" de cómo se crean los algoritmos.

Pero el mejor consejo que puedo darle (que puede usar de las dos maneras anteriores para adquirir): intente ser muy bueno en algunos algoritmos. Si pudiera recordar, escriba y realmente comprenda incluso algunos algoritmos básicos: está en el camino correcto.

De todas formas, creo que los algoritmos de aprendizaje es fundamentalmente práctica y menos "conocimiento abstracto", por lo que se preparan a ensuciarse las manos ..

mejor de la suerte !!

10

es posible que desee tomar una clase de filosofía en la introducción a la lógica. es exactamente lo mismo que estás haciendo con las computadoras, pero en un contexto diferente.

+0

+1 para la clase lógica de filosofía ... eso es realmente pensar fuera de la caja. –

6

Si te ayuda, tal vez quieras probar libros en tu idioma nativo. Si hay algún vacío en su comprensión que proviene de su comprensión de inglés, eso le agregaría una dificultad adicional.

En segundo lugar, un algoritmo, es solo una lista de pasos para lograr algo. Intenta enfocarte en algo simple como ordenar algoritmos, son divertidos y fáciles de aprender. Espero que ayude.

+1

Estoy de acuerdo con ambas ideas, especialmente la segunda. Ciertamente usted (el póster original) resuelve problemas analíticamente y lógicamente todos los días. El único truco para programar (aparte de aprender la sintaxis) es ser consciente de cada uno de los pasos que se ajustan a su proceso natural de resolución de problemas. Antes de escribir cualquier código real, dedico mucho tiempo a pensar en cada paso que conduce al resultado final. Luego cierro estos pasos en cualquier condición necesaria, y lentamente mi pseudocódigo se convierte en código real y funcional. ¡Como una ventaja adicional, generalmente también termina con muchos comentarios! –

2

Si quieres saltar en la parte más profunda y estás dispuesto a trabajar duro, existe "Structure and Interpretation of Computer Programs". Está agotado pero disponible en la red.

Se adentra en los procesos de pensamiento conceptual detrás de la programación y los convierte en código. Utiliza el esquema, pero los principios son aplicables en todas partes y es un gran entrenamiento para flexionar los músculos de abstracción.

No lo hagas de una vez ... tómate tu tiempo, vuelve regularmente y diviértete!

7

Descubrí que la habilidad más importante para dominar las estructuras de datos es "visualizarlas". Si no tiene una imagen clara de su estructura de datos, todo se vuelve borroso e impreciso. P.ej. tomar una pila (lista de enlaces individuales). Puede ayudar a visualizarlo como una pila de platos o personas en una polonesa (todos tienen las manos sobre los hombros de la persona que tiene delante).

O una lista de doble enlace: Imagine una fila de personas agarrando el cinturón del vecino izquierdo y derecho. Ahora puede imaginar lo que debe hacer para eliminar a una persona: su vecino de la izquierda necesita agarrar el cinturón del vecino de la derecha y el vecino de la derecha del vecino de la izquierda. Luego puede "eliminar" a esa persona (o el recolector de basura hace esto por usted en Java, etc.)

La segunda habilidad importante es comprender la recursividad. Siempre necesita un caso base, que generalmente involucra una lista vacía o un nodo vacío. Cuando sigue el algoritmo en el método recursivo, verifique que sea correcto, pero no sigue las llamadas recursivas dentro de ese método. Eso te volverá loco y te llevará a nada. Solo asuma que las llamadas recursivas siempre "hacen lo correcto". Si su método actual es correcto y el caso base también, ya está. Una vez que entendiste esto, entiendes la recursividad.

+1

+1 para una buena analogía. – casablanca

+0

Para la recursividad, estoy en desacuerdo sobre no seguir el caso; eso es lo que haces cuando ya piensas recursión. Pero cuando se aprende, es importante seguir un ejemplo simple de 5 nodos hasta el final. – FastAl

+0

Otra cosa ... MUCHO más importante cuando se trata de la recursión es que __debes entender todos los parámetros pasados ​​y las variables locales van a la pila de llamadas __ !!! Por lo tanto, un requisito previo para escribir funciones recursivas es SABER ABSOLUTAMENTE (1) la estructura de datos de la pila (2) EXACTAMENTE cómo se pasan los parámetros (por ejemplo, los nombres que se pasan en no importan, etc.); (3) cómo parms y variables locales se ponen en la pila. De lo contrario, la respuesta lógica: ¡la recursión es imposible! – FastAl

3

Creo que es una buena práctica usar diagramas antes de implementar cualquier cosa. Puede hacer diagrams o escribir a pseudo code, son útiles antes de comenzar a diseñar o implementar el código real.

2

Trata de pensar en cómo abordar los problemas cognitivos cotidianos y formaliza los pasos que tomas para resolverlos, en papel.

Por ejemplo, si alguna vez ha tenido que reordenar una baraja de 52 cartas revueltas, probablemente ya sepa Ordenar de inserción o alguna variante de Combinar tipo. Si se le pide que ordene cinco números de dos dígitos en su cabeza, probablemente esté utilizando Selection Sort. Si ha tenido que encontrar una carta específica de un mazo desordenado, probablemente haya usado Búsqueda lineal. Si alguna vez has visto el 'High Low Game' en 'The Price is Right', probablemente conozcas la búsqueda binaria. Si se te pide que resuelvas el problema 8-Queens como un 'acertijo', seguramente utilizarás la técnica clásica de retroceso.

No dejes que la jerga como 'loop invariant' o 'asymptotic time complexity' te intimide de inmediato. Piense en cómo un algoritmo está tratando el problema, y ​​se encontrará a sí mismo "redescubriendo" estos términos usted mismo cuando quiera razonar sobre su corrección o eficiencia.

3

No sé en qué medida se trata este problema, pero podría ser útil.

Los algoritmos y las estructuras de datos son mucho más limpios para mí si los pienso como ideas informales/cajas/formas/formas/conexiones/... en lugar de cosas abstractas.

Es decir, cada vez que me encuentro con una nueva estructura de datos trato de visualizarla de alguna manera para realmente poder "ver" lo que hacen las operaciones individuales con la estructura.

También tuve a veces el problema de que en realidad no sabía instantáneamente cómo resolver algo algorítmicamente, así que simplemente seguí adelante y comencé a dibujar.

Tomemos como ejemplo el problema de convertir un árbol binario en una lista. Entonces, dibujo un árbol (de tamaño arbitrario y con elementos arbitrarios, pero siendo un "buen" ejemplo). Entonces pienso cómo iba a convertir el árbol en una lista manualmente:

 1 
    2  3 
    4 5 6 7 

Así que creo: yo quiero tener el resultado [4,2,5,1,6,3,7]. ¿Cómo puedo hacer esto paso a paso?

Ok, antes que nada, encuentro el elemento más a la izquierda (4); ¿Cómo puedo hacer esto? Bien, empiezo por la raíz y voy a la izquierda hasta que no haya nada más.Luego se quita este elemento y seguir con el árbol restante:

 1 
    2  3 
    . 5 6 7 

Ok, ahora yo escogería la 2. ¿Cómo puedo llegar al 2? Bien, puedo comenzar de nuevo en la raíz y seguir hacia la izquierda hasta que no haya nada más o que acabo de regresar desde el nodo eliminado.

Después paso y buscar patrones recurrentes, cómo se puede generalizar pasos etc.

El resultado es, a menudo puede ser útil tener una representación visual de lo que está haciendo el algoritmo y luego se puede aplicar eso.

3

Tuve un problema similar cuando me introduje por primera vez a los lenguajes de programación. ¡Me perdí muchas conferencias porque era mi primer año de universidad! Para mí no encontré libros ni profesores que supieran cómo ayudarte a pensar como un programador. Siempre encontré que las personas que enseñaban ya no sabían cómo "no" pensar como un programador y, como resultado, asumen que conoces los conceptos simples. ¡Así que finalmente al final de mi primer año tuve que esforzarme mucho para ponerme al día y tuve que llenar los vacíos yo mismo ...! Así es como pienso sobre los problemas de programación ahora:

OBJETOS: Para objetos de programación orientada a objetos, la clave es todo. Si piensas qué es lo que tu programa necesita poder hacer, entonces puedes dividirlo en trozos más pequeños. Por ejemplo, si uno se imagina que hacen una taza de té, los objetos que necesita para tomar la taza de té son:

1 -> A cup 
2 -> A tea bag 
3 -> Water 
4 -> A kettle 
5 -> A spoon 
6 -> Milk 
7 -> Sugar 

Así que ahora su programa tiene 7 objetos que van a interactuar de alguna manera para hacer una taza de té . Los objetos siempre se declaran como su propia clase y tendrán métodos de construcción que cuando sean llamados crearán una copia (instanciación) de su objeto que luego podrá ser utilizada en su programa. Todo el método que está dentro de su clase definirá qué funcionalidad puede proporcionar su objeto.

Kettle kettle = new Kettle(); 
kettle.boilWater(); 

Ahora que tiene sus objetos, debería pensar en su algoritmo.

ALGORITMOS: En todos los lenguajes de programación, un algoritmo es básicamente una lista de pasos que usted puede seguir para alcanzar su objetivo final. En nuestro caso, nuestro objetivo final es hacer una taza de té.

Los pasos que deberá seguir en su algoritmo tienen que venir uno tras otro de una manera lógica es decir, no se puede verter la leche en la caldera, o echar agua fría en la taza y hervir el azúcar, etc.

Por lo tanto nuestro algoritmo puede ser el siguiente:

Step 1: Pour water into Kettle 
Step 2: Turn kettle on - to boil the water 
Step 3: Put tea-bag into cup 
Step 4: "IF" water is boiled -> pour into cup 
     "ELSE" wait until water has boiled 
Step 5: Stir teabag with spoon 
Step 6: Pour milk into cup 
Step 7: Put sugar into cup 
Step 8: Stir 

siempre hay algunas maneras diferentes se pueden organizar los pasos en un algoritmos que todavía funciona, pero siempre se acuerdan de tener un orden lógico o de lo contrario hacer un lío! !

El mismo principio se puede aplicar incluso a los problemas más complejos. Lo más importante es intentar dividir el problema en los pasos más simples y organizar los pasos de una manera de sentido común.

Cuando se trata de tareas más complejas, es obviamente muy importante saber qué herramientas tiene a su disposición, es decir, saber qué funcionalidad le proporcionan las API y estar familiarizado con la sintaxis. Pero como la gente ya te ha mencionado antes, la práctica hace al maestro.Es la única manera en que comenzarás a entenderlo y créanme que finalmente lo conseguirás ... Algún día TODO tendrá sentido para ti, solo se trata de pensar de cierta manera. Divida todo en pequeños pasos simples y luego ordene los pasos de una manera lógica. Haz esto y comenzará a tener sentido para ti. ¡¡LO PROMETO!!

1

Sugiero que pueda probar algunos de los sitios web que contienen una serie de problemas algorítmicos para resolver. Por lo general, puede encontrar una serie de problemas muy fáciles para empezar, y foros para debatirlos. Entonces depende de usted y de cuánto tiempo pasa en ellos. Intenta entrar en tantos detalles como sea posible y pregúntate qué es exactamente lo que no entiendes, entonces, ¿cómo podrías averiguarlo? (Tal vez alguien ya se haya dado cuenta y solo necesites encontrar la respuesta). Para los problemas más fáciles, Google es más que suficiente para encontrar las respuestas que está buscando.

Y aquí está la lista de sitios web que puede probar:
uva.onlinejudge.org - Gran lista de problemas relacionados con diferentes algoritmos.
www.topcoder.com/tc - Concursos en vivo y muchos tutoriales para comenzar.
www.algorithmist.com - Contiene una lista de enlaces recopilados a lo largo del tiempo por solucionadores de problemas.

Cuestiones relacionadas