Está en la página 1de 3

Diseñar el algoritmo adecuado para una aplicación determinada es un acto creativo importante: el de

tomar un problema y sacar una solución del éter. El espacio de elecciones que puede hacer en el diseño
de algoritmos es enorme, lo que le deja mucha libertad para ahorcarse.

Este libro está diseñado para convertirlo en un mejor diseñador de algoritmos. Las técnicas presentadas
en la Parte I de este libro proporcionan las ideas básicas que subyacen a todos los algoritmos
combinatorios. El catálogo de problemas de la Parte II le ayudará a modelar su aplicación y le dirá lo que
se sabe sobre los problemas relevantes. Sin embargo, ser un diseñador de algoritmos exitoso requiere
más que conocimientos de libros. Requiere una cierta actitud: el enfoque correcto para la resolución de
problemas. Es difícil enseñar esta forma de pensar en un libro, pero obtenerla es esencial para
convertirse en un diseñador exitoso.

La clave para el diseño de algoritmos (o cualquier otra tarea de resolución de problemas) es continuar
haciéndose preguntas para guiar su proceso de pensamiento. ¿Y si hacemos esto? ¿Y si hacemos eso? Si
se queda atascado en el problema, lo mejor que puede hacer es pasar a la siguiente pregunta. En
cualquier sesión de lluvia de ideas grupal, la persona más útil en la sala es la que sigue preguntando:
"¿Por qué no podemos hacerlo de esta manera?" no la persona que luego les dice por qué, porque
eventualmente tropezará con un enfoque que no puede ser derribado.

Con este fin, proporcionamos una secuencia de preguntas para guiar su búsqueda del algoritmo
adecuado para su problema. Para usarlo de manera efectiva, no solo debe hacer las preguntas, sino
también responderlas. La clave es trabajar con cuidado las respuestas escribiéndolas en un registro. La
respuesta correcta a "¿Puedo hacerlo de esta manera?" nunca es "no", sino "no, por qué." . . . " Al
articular claramente su razonamiento sobre por qué algo no funciona, puede verificar si ha pasado por
alto una posibilidad en la que no quería pensar lo suficiente. Es sorprendente la frecuencia con la que la
razón por la que no puede encontrar una explicación convincente para algo es porque su conclusión es
incorrecta.

Es importante tener en cuenta la distinción entre estrategia y táctica durante cualquier proceso de
diseño. La estrategia representa la búsqueda del panorama general, el marco alrededor del cual
construimos nuestro camino hacia la meta. Las tácticas se utilizan para ganar las pequeñas batallas que
debemos librar en el camino. En la resolución de problemas, es importante comprobar repetidamente si
está pensando en el nivel correcto. Si no tiene una estrategia global de cómo va a atacar su problema,
no tiene sentido preocuparse por las tácticas. Un ejemplo de una pregunta estratégica es "¿Puedo
modelar mi aplicación como un problema de algoritmo gráfico?" Una pregunta táctica podría ser:
"¿Debería usar una lista de adyacencia o una estructura de datos de matriz de adyacencia para
representar mi gráfico?" Por supuesto, tales decisiones tácticas son críticas para la calidad final de la
solución, pero solo pueden evaluarse adecuadamente a la luz de una estrategia exitosa.

Demasiadas personas se congelan en sus pensamientos cuando se enfrentan a un problema de diseño.


Después de leer o escuchar el problema, se sientan y se dan cuenta de que no saben qué hacer a
continuación. Evita este destino. Siga la secuencia de preguntas que se proporcionan a continuación y en
la mayoría de las secciones de problemas del catálogo. ¡Te diremos qué hacer a continuación!
Obviamente, cuanta más experiencia tenga con técnicas de diseño de algoritmos como programación
dinámica, algoritmos de gráficos, intratabilidad y estructuras de datos, más éxito tendrá en la
elaboración de la lista de preguntas. La Parte I de este libro ha sido diseñada para fortalecer esta base
técnica. Sin embargo, vale la pena resolver estas preguntas independientemente de cuán sólidas sean
sus habilidades técnicas. Las preguntas más tempranas e importantes de la lista se centran en obtener
una comprensión detallada de su problema y no requieren experiencia específica.

Esta lista de preguntas se inspiró en un pasaje de [Wol79], un libro maravilloso sobre el programa
espacial titulado The Right Stuff. Se refería a las transmisiones de radio de los pilotos de prueba justo
antes de que se estrellaran sus aviones. Uno podría haber esperado que entraran en pánico, por lo que
el control de tierra oiría al piloto gritar Ahhhhhhhhhhh, terminado solo por el sonido de chocar con una
montaña. En cambio, los pilotos revisaron una lista de cuáles podrían ser sus posibles acciones. Probé las
solapas. Revisé el motor. Todavía tengo dos alas. Reinicié el -. Tenían "las cosas adecuadas". Debido a
esto, a veces lograron perder la montaña. Espero que este libro y esta lista le proporcionen "las cosas
adecuadas" para ser un diseñador de algoritmos. Y espero que te impida chocar con las montañas por el
camino.

1. ¿Comprendo realmente el problema?

(a) ¿En qué consiste exactamente la entrada?

(b) ¿Cuáles son exactamente los resultados o la producción deseados?

(c) ¿Puedo construir un ejemplo de entrada lo suficientemente pequeño como para resolverlo a mano?
¿Qué pasa cuando trato de solucionarlo?

(d) ¿Qué importancia tiene para mi solicitud que siempre encuentre la respuesta óptima? ¿Puedo
conformarme con algo cercano a la respuesta óptima?

(b) ¿Puedo resolver mi problema probando repetidamente alguna regla simple, como elegir el artículo
más grande primero? ¿El artículo más pequeño primero? ¿Un elemento aleatorio primero? Si es así, ¿en
qué tipos de entradas funciona bien esta heurística? ¿Corresponden estos a los datos que pudieran
surgir en mi aplicación?

ii. ¿En qué tipos de entradas funciona mal esta heurística? Si no se pueden encontrar tales ejemplos,
¿puedo demostrar que siempre funciona bien?

iii. ¿Qué tan rápido llega mi heurística a una respuesta? ¿Tiene una implementación sencilla?

3. ¿Está mi problema en el catálogo de problemas algorítmicos al final de este libro?

(a) ¿Qué se sabe sobre el problema? ¿Hay alguna implementación disponible que pueda usar?

(b) ¿Busqué mi problema en el lugar correcto? ¿Busqué todas las imágenes? ¿Busqué en el índice todas
las palabras clave posibles?

(c) ¿Hay recursos relevantes disponibles en la World Wide Web? ¿Hice una búsqueda en la web de
Google y en Google Académico? ¿Fui a la página asociada con este libro,
http://www.cs.sunysb.edu/∼algorith?

4. ¿Hay casos especiales del problema que sé cómo resolver?

(a) ¿Puedo resolver el problema de manera eficiente cuando ignoro algunas de las entradas

parámetros?
(b) ¿El problema se vuelve más fácil de resolver cuando establezco algunos de los parámetros de
entrada en valores triviales, como 0 o 1?

(c) ¿Puedo simplificar el problema hasta el punto en que pueda resolverlo de manera eficiente?

(d) ¿Por qué no se puede generalizar este algoritmo de casos especiales a una clase más amplia de
entradas?

(e) ¿Mi problema es un caso especial de un problema más general en el catálogo?

5. ¿Cuáles de los paradigmas de diseño de algoritmos estándar son más relevantes para mi problema?

(a) ¿Existe un conjunto de elementos que se puedan clasificar por tamaño o alguna clave? ¿Este orden
ordenado hace que sea más fácil encontrar la respuesta?

(b) ¿Hay alguna manera de dividir el problema en dos problemas más pequeños, quizás haciendo una
búsqueda binaria? ¿Qué tal dividir los elementos en grandes y pequeños, o de izquierda a derecha?
¿Sugiere esto un algoritmo de divide y vencerás?

(c) ¿Los objetos de entrada o la solución deseada tienen un sentido natural de izquierda a derecha?

orden, como caracteres en una cadena, elementos de una permutación u hojas de un árbol? ¿Puedo
utilizar programación dinámica para explotar este orden?

(d) ¿Se realizan ciertas operaciones repetidamente, como buscar o encontrar el elemento más grande /
más pequeño? ¿Puedo usar una estructura de datos para acelerar estas consultas? ¿Qué pasa con un
diccionario / tabla hash o una cola de prioridad / montón?

(e) ¿Puedo usar un muestreo aleatorio para seleccionar qué objeto elegir a continuación? ¿Qué hay de
construir muchas configuraciones aleatorias y elegir la mejor? ¿Puedo usar algún tipo de aleatoriedad
dirigida como el recocido simulado para acercarme a la mejor solución?

(f) ¿Puedo formular mi problema como un programa lineal? ¿Qué tal un programa de enteros?

(g) ¿Parece mi problema algo así como la satisfacción, el problema del viajante de comercio o algún otro
problema NP-completo? ¿Podría el problema ser NP-completo y, por lo tanto, no tener un algoritmo
eficiente? ¿Está en la lista de problemas en la parte posterior de Garey y Johnson [GJ79]?

6. ¿Todavía estoy perplejo?

(a) ¿Estoy dispuesto a gastar dinero para contratar a un experto que me diga qué hacer? Si es así,
consulte los servicios de consultoría profesional mencionados en la Sección 19.4 (página 664).

(b) ¿Por qué no regreso al principio y resuelvo estas preguntas de nuevo? ¿Cambió alguna de mis
respuestas durante mi último viaje a través de la lista?

La resolución de problemas no es una ciencia, sino en parte arte y en parte habilidad. Es una de las
habilidades que más vale la pena desarrollar. Mi libro favorito sobre resolución de problemas sigue
siendo How to Solve It [P´57], de Polya, que presenta un catálogo de técnicas de resolución de
problemas que es fascinante explorar, tanto antes como después de tener un problema.

También podría gustarte