Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1.1 Algoritmos
Informalmente, un algoritmo es cualquier procedimiento
computacional bien definido que toma algún valor, o conjunto de
valores, como entrada y produce algún valor, o conjunto de valores,
como salida. Por lo tanto, un algoritmo es una secuencia de pasos
computacionales que transforman la entrada en la salida.
También podemos ver un algoritmo como una herramienta para
resolver un problema computacional bien especificado. La declaración
del problema especifica en términos generales la relación deseada de
entrada / salida. El algoritmo describe un procedimiento computacional
específico para lograr esa relación de entrada / salida.
Por ejemplo, podríamos necesitar ordenar una secuencia de números
en orden no decreciente. Este problema surge con frecuencia en la
práctica y proporciona un terreno fértil para introducir muchas técnicas
de diseño estándar y herramientas de análisis. Así es como definimos
formalmente el problema de clasificación:
Por ejemplo, dada la secuencia de entrada [31; 41; 59; 26; 41; 58], un
algoritmo de clasificación devuelve como salida la secuencia [26; 31; 41;
41; 58; 5]. Tal secuencia de entrada se llama una instancia del problema
de clasificación. En general, una instancia de un problema consiste en la
entrada (que satisface las restricciones impuestas en la declaración del
problema) necesaria para calcular una solución al problema.
Aunque algunos de los detalles de estos ejemplos están más allá del
alcance de este libro, brindamos técnicas subyacentes que se aplican a
estos problemas y áreas problemáticas. También mostramos cómo
resolver muchos problemas específicos, incluidos los siguientes:
Se nos dan dos secuencias ordenadas de símbolos, X = {x1; x2; :::; xm} e Y
= {y1; y2; :::; yn}, y deseamos encontrar una subsecuencia común más
larga de X e Y. Una subsecuencia de X es solo X con algunos (o
posiblemente todos o ninguno) de sus elementos eliminados. Por
ejemplo, una subsecuencia de {A; B; C; D; E; F; G} sería {B; C; E; G};
Soldado americano. La longitud de una subsecuencia común más larga
de X e Y da una medida de cuán similares son estas dos secuencias. Por
ejemplo, si las dos secuencias son pares de bases en cadenas de ADN,
entonces podríamos considerarlas similares si tienen una subsecuencia
común larga. Si X tiene m símbolos e Y tiene n símbolos, entonces X e Y
tienen 2m y 2n subsecuencias posibles, respectivamente. Seleccionar
todas las subsecuencias posibles de X e Y y hacerlas coincidir podría
llevar un tiempo prohibitivamente largo a menos que m y n sean muy
pequeñas. En el Capítulo 15 veremos cómo usar una técnica general
conocida como programación dinámica para resolver este problema de
manera mucho más eficiente.
Se nos da un diseño mecánico en términos de una biblioteca de partes,
donde cada parte puede incluir instancias de otras partes, y debemos
enumerar las partes en orden para que cada parte aparezca antes de
cualquier parte que la use. Si el diseño comprende n partes, entonces
hay n! posibles órdenes, donde n! denota la función factorial. Debido a
que la función factorial crece más rápido que incluso una función
exponencial, no podemos generar de manera factible cada orden
posible y luego verificar que, dentro de ese orden, cada parte aparezca
antes que las partes que la usan (a menos que tengamos solo unas
pocas partes). Este problema es una instancia de clasificación
topológica, y veremos en el Capítulo 22 cómo resolver este problema
de manera eficiente.
Estructuras de datos
Este libro también contiene varias estructuras de datos. Una
estructura de datos es una forma de almacenar y organizar datos
para facilitar el acceso y las modificaciones. Ninguna estructura de
datos única funciona bien para todos los propósitos, por lo que es
importante conocer las fortalezas y limitaciones de varios de ellos.
Técnica
Aunque puede usar este libro como un "libro de cocina" para
algoritmos, algún día puede encontrar un problema para el cual no
puede encontrar fácilmente un algoritmo publicado (muchos de los
ejercicios y problemas en este libro, por ejemplo). Este libro le
enseñará técnicas de diseño y análisis de algoritmos para que pueda
desarrollar algoritmos por su cuenta, demostrar que dan la
respuesta correcta y comprender su eficiencia. Los diferentes
capítulos abordan diferentes aspectos de la resolución algorítmica
de problemas. Algunos capítulos abordan problemas específicos,
como encontrar medianas y estadísticas de pedidos en el Capítulo 9,
calcular los árboles de expansión mínima en el Capítulo 23 y
determinar un flujo máximo en una red en el Capítulo 26. Otros
capítulos abordan técnicas, como dividir y conquistar en Capítulo 4,
programación dinámica en el Capítulo 15 y análisis amortizado en el
Capítulo 17.
Problemas difíciles
La mayor parte de este libro trata sobre algoritmos eficientes.
Nuestra medida habitual de eficiencia es la velocidad, es decir,
cuánto tiempo tarda un algoritmo en producir su resultado. Sin
embargo, hay algunos problemas para los cuales no se conoce una
solución eficiente. El capítulo 34 estudia un subconjunto interesante
de estos problemas, que se conocen como NP-completo.
¿Por qué son interesantes los problemas de NP completo? Primero,
aunque nunca se ha encontrado un algoritmo eficiente para un
problema NP-completo, nadie ha probado que no pueda existir un
algoritmo eficiente para uno. En otras palabras, nadie sabe si existen
o no algoritmos eficientes para problemas NP-completos. En
segundo lugar, el conjunto de problemas NP-completos tiene la
notable propiedad de que si existe un algoritmo eficiente para
cualquiera de ellos, entonces existen algoritmos eficientes para
todos ellos. Esta relación entre los problemas NP-completos hace
que la falta de soluciones eficientes sea aún más tentadora. En tercer
lugar, varios problemas de NP completo son similares, pero no
idénticos, a problemas para los que sí conocemos algoritmos
eficientes. Los informáticos están intrigados por cómo un pequeño
cambio en la declaración del problema puede causar un gran cambio
en la eficiencia del algoritmo más conocido.
Debe conocer los problemas de NP completo porque algunos surgen
sorprendentemente a menudo en aplicaciones reales. Si se le pide
que produzca un algoritmo eficiente para un problema de NP
completo, es probable que pase mucho tiempo en una búsqueda
infructuosa. Si puede demostrar que el problema es NP-completo,
puede dedicar su tiempo a desarrollar un algoritmo eficiente que
ofrezca una buena solución, pero no la mejor.
Paralelismo
Durante muchos años, pudimos contar con que las velocidades del
reloj del procesador aumentaran a un ritmo constante. Sin embargo,
las limitaciones físicas presentan un obstáculo fundamental para las
velocidades de reloj cada vez mayores: debido a que la densidad de
potencia aumenta de manera superlineal con la velocidad del reloj,
los chips corren el riesgo de derretirse una vez que sus velocidades
de reloj se vuelven lo suficientemente altas. Para realizar más
cálculos por segundo, por lo tanto, los chips están siendo diseñados
para contienen no solo uno sino varios "núcleos" de procesamiento.
Podemos comparar estas computadoras multinúcleo con varias
computadoras secuenciales en un solo chip; en otras palabras, son
un tipo de "computadora paralela". Para obtener el mejor
rendimiento de las computadoras multinúcleo, necesitamos diseñar
algoritmos teniendo en cuenta el paralelismo. El Capítulo 27
presenta un modelo para algoritmos "multiproceso", que
aprovechan múltiples núcleos. Este modelo tiene ventajas desde un
punto de vista teórico, y forma la base de varios programas
informáticos exitosos, incluido un programa de ajedrez de
campeonato.
Ejercicios
1.1-1
Dé un ejemplo del mundo real que requiera clasificación o un
ejemplo del mundo real que requiera calcular un casco convexo.
1.1-2
Además de la velocidad, ¿qué otras medidas de eficiencia se podrían
usar en un entorno real?
1.1-3
Seleccione una estructura de datos que haya visto anteriormente y
analice sus fortalezas y limitaciones.
1.1-4
¿En qué se parecen los problemas de camino más corto y vendedor
ambulante que se mencionan anteriormente? ¿En qué se
diferencian?
1.1-5
Proponga un problema del mundo real en el que solo funcione la
mejor solución. Luego, encuentre una en la que una solución que sea
"aproximadamente" la mejor sea buena
suficiente.
---------------------------------------------------------------------------------------