Вы находитесь на странице: 1из 6

UNIDAD 1 : Analisis de Algoritmos Concepto Complejidad Algoritmos La resolucin prctica de un problema exige por una parte un algoritmo o mtodo

de resolucin y por otra un programa o codificacin de aquel en un ordenador real. Ambos componentes tienen su importancia, pero la del algoritmo es absolutamente esencial, mientras que la codificacin puede muchas veces pasar a nivel de ancdota. A efectos prcticos o ingenieriles, nos deben preocupar los recursos fsicos necesarios para que un programa se ejecute. Aunque puede haber muchos parametros, los mas usuales son el tiempo de ejecucin y la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parametros estn fijados por otras razones y se plantea la pregunta inversa: cual es el tamano del mayor problema que puedo resolver en T segundos y/o con M bytes de memoria? En lo que sigue nos centramos casi siempre en el parametro tiempo de ejecucin, si bien las ideas desarrolladas son fcilmente aplicables a otro tipo de recursos. Para cada problema determinaremos un medida N de su tamao (por nmero de datos) e intentaremos hallar respuestas en funcin de dicho N. El concepto exacto que mide N depende de la naturaleza del problema. As, para un vector se suele utizar como N su longitud; para una matriz, el nmero de elementos que la componen; para un grafo, puede ser el nmero de nodos (a veces es mas importante considerar el nmero de arcos, dependiendo del tipo de problema a resolver), en un archivo se suele usar el nmero de registros, etc. Es imposible dar una regla general, pues cada problema tiene su propia lgica de coste. Tiempo de Ejecucin Una medida que suele ser til conocer es el tiempo de ejecucin de un programa en funcin de N, lo que denominaremos T(N). Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano), o calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instruccin. As, un trozo sencillo de programa como: S1; for (int i= 0; i < N; i++) S2; requiere

T(N)= t1 + t2*N siendo t1 el tiempo que lleve ejecutar la serie S1 de sentencias, y t2 el que lleve la serie S2. Prcticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten. Esto hace que mas que un valor T(N) debamos hablar de un rango de valores Tmin(N) T(N) Tmax(N) los extremos son habitualmente conocidos como caso peor y caso mejor. Entre ambos se hallara algun caso promedio o ms frecuente. Cualquier frmula T(N) incluye referencias al parmetro N y a una serie de constantes Ti que dependen de factores externos al algoritmo como pueden ser la calidad del cdigo generado por el compilador y la velocidad de ejecucin de instrucciones del ordenador que lo ejecuta. Dado que es fcil cambiar de compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso (en la actualidad, se duplica anualmente), intentaremos analizar los algoritmos con algun nivel de independencia de estos factores; es decir, buscaremos estimaciones generales ampliamente vlidas. Es la memoria que utiliza un programa para su ejecucin; es decir el espacio de memoria que ocupan todas las variables propias del algoritmo. Esta se divide en Memoria Esttica y Memoria Dinmica. Memoria esttica. Para calcularla se suma de memoria que ocupan las variables declaradas en el algoritmo. Memoria dinmica. Su clculo no es tan simple ya que depende de cada ejecucin del algoritmo. Ejemplo: algoritmo de bsqueda en arboles. Funcin bsqueda_arboles. Devuelve una solucin o fallo. Inicializa un rbol de bsqueda con estado inicial. Bucle hacer Si no hay candidatos para expandir.

Entonces devolver fallo. En otro caso escoger nodo para expandir. Si el nodo es el objetivo. Entonces devolver solucin. En otro caso expandir nodo. M = profundidad mxima del rbol (puede ser infinita) D = profundidad de la mejor solucin (menor costo) B = factor de ramificacion (numero mximo de sucesiones) = 10 Depth Nodes Time Memory
0 milisecond 2 11 Kb 4 1 Mb 6 111 Mb 10 ^ 6 18 minutos 1 100 bytes 111 11111 .1 second 11 second 1

Eficiencia de los algoritmos


La tcnica que se utilizaba en los primeros aos de la programacin para comparar la eficiencia de distintos algoritmos consista en ejecutarlos para datos diferentes y medir el tiempo consumido. Dado que las mquinas y los lenguajes eran dispares, y que el tiempo de ejecucin depende no solo del tamao sino tambin del contenido de los datos, resultaba muy difcil comparar tales resultados. El primer estudio serio sobre la eficiencia de los algoritmos se lo debemos a Daniel Goldenberg del MIT. En 1952 realiz un anlisis matemtico del nmero de comparaciones necesarias, en el mejor y en el peor caso, de cinco algoritmos distintos de ordenacin. La tesis doctoral de Howard B. Demuth de la Universidad de Stanford estableci en 1956 las bases de lo que hoy llamamos anlisis de la complejidad de los algoritmos.
R.

Una de las caractersticas primordiales en la seleccin de un algoritmo es que este sea sencillo de entender calcular codificar y depurar, as mismo que utilice eficientemente los recursos del ordenador y se ejecute con la mayor rapidez posible con un eficaz uso de memoria dinmica y esttica. Tambin para seleccionar correctamente el mejor algoritmo es necesario realizar estas preguntas:

Qu grado de orden tendr la informacin que vas a manejar?

Si la informacin va a estar casi ordenada y no quieres complicarte, un algoritmo sencillo como el ordenamiento burbuja ser suficiente. Si por el contrario los datos van a estar muy desordenados, un algoritmo poderoso como Quicksort puede ser el ms indicado. Y si no puedes hacer una presuncin sobre el grado de orden de la informacin, lo mejor ser elegir un algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos.

Qu cantidad de datos vas a manipular? Si la cantidad es pequea, no es necesario utilizar un algoritmo complejo, y es preferible uno de fcil implementacin. Una cantidad muy grande puede hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria adicional.

Qu tipo de datos quieres ordenar? Algunos algoritmos slo funcionan con un tipo especfico de datos

(enteros, enteros positivos, etc.) y otros son generales, es decir, aplicables a cualquier tipo de dato.

Qu tamao tienen los registros de tu lista? Algunos algoritmos realizan mltiples intercambios

(burbuja, insercin). Si los registros son de gran tamao estos intercambios son ms lentos.

1. Introduccin
La resolucin prctica de un problema exige por una parte un algoritmo o mtodo de resolucin y por otra un programa o codificacin de aquel en un ordenador real. Ambos componentes tienen su importancia; pero la del algoritmo es absolutamente esencial, mientras que la codificacin puede muchas veces pasar a nivel de ancdota. A efectos prcticos o ingenieriles, nos deben preocupar los recursos fsicos necesarios para que un programa se ejecute. Aunque puede haber muchos parametros, los mas usuales son el tiempo de ejecucin y la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parametros estn fijados por otras razones y se plantea la pregunta inversa: cual es el tamano del mayor problema que puedo resolver en T segundos y/o con M bytes de memoria? En lo que sigue nos centraremos casi siempre en el parametro tiempo de ejecucin, si bien las ideas desarrolladas son fcilmente aplicables a otro tipo de recursos. Para cada problema determinaremos un medida N de su tamao (por nmero de datos) e intentaremos hallar respuestas en funcin de dicho N. El concepto exacto que mide N depende de la naturaleza del problema. As, para un vector se suele utizar como N su longitud; para una matriz, el nmero de elementos que la componen; para un grafo,

puede ser el nmero de nodos (a veces es mas importante considerar el nmero de arcos, dependiendo del tipo de problema a resolver); en un fichero se suele usar el nmero de registros, etc. Es imposible dar una regla general, pues cada problema tiene su propia lgica de coste.

2. Tiempo de Ejecucin
Una medida que suele ser til conocer es el tiempo de ejecucin de un programa en funcin de N, lo que denominaremos T(N). Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano), o calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instruccin. As, un trozo sencillo de programa como
S1; for (int i= 0; i < N; i++) S2; T(N)= t1 + t2*N

requiere siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, y t2 el que lleve la serie "S2". Prcticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten. Esto hace que mas que un valor T(N) debamos hablar de un rango de valores
Tmin(N) <= T(N) <= Tmax(N)

los extremos son habitualmente conocidos como "caso peor" y "caso mejor". Entre ambos se hallara algun "caso promedio" o ms frecuente. Cualquier frmula T(N) incluye referencias al parmetro N y a una serie de constantes "Ti" que dependen de factores externos al algoritmo como pueden ser la calidad del cdigo generado por el compilador y la velocidad de ejecucin de instrucciones del ordenador que lo ejecuta. Dado que es fcil cambiar de compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso (en la actualidad, se duplica anualmente), intentaremos analizar los algoritmos con algun nivel de independencia de estos factores; es decir, buscaremos estimaciones generales ampliamente vlidas.

3. Asintotas
Por una parte necesitamos analizar la potencia de los algoritmos independientemente de la potencia de la mquina que los ejecute e incluso de la habilidad del programador que los codifique. Por otra, este anlisis nos interesa especialmente cuando el algoritmo se aplica a problema grandes. Casi siempre los problemas pequeos se pueden resolver de cualquier forma, apareciendo las limitaciones al atacar problemas grandes. No debe olvidarse que cualquier tcnica de ingeniera, si funciona, acaba aplicndose al problema ms grande que sea posible: las tecnologias de xito, antes o despus, acaban llevndose al lmite de sus posibilidades. Las consideraciones anteriores nos llevan a estudiar el comportamiento de un algoritmo cuando se fuerza el tamao del problema al que se aplica. Matemticamente hablando, cuando N tiende a infinito. Es decir, su comportamiento asinttico.

Sean "g(n)" diferentes funciones que determinan el uso de recursos. Habra funciones "g" de todos los colores. Lo que vamos a intentar es identificar "familias" de funciones, usando como criterio de agrupacin su comportamiento asinttico. A un conjunto de funciones que comparten un mismo comportamiento asinttico le denominaremos un rden de complejidad'. Habitualmente estos conjuntos se denominan O, existiendo una infinidad de ellos. Para cada uno de estos conjuntos se suele identificar un miembro f(n) que se utiliza como representante de la clase, hablndose del conjunto de funciones "g" que son del orden de "f(n)", denotndose como
g IN O(f(n))

Con frecuencia nos encontraremos con que no es necesario conocer el comportamiento exacto, sino que basta conocer una cota superior, es decir, alguna funcin que se comporte "an peor". La definicin matemtica de estos conjuntos debe ser muy cuidadosa para involucrar ambos aspectos: identificacin de una familia y posible utilizacin como cota superior de otras funciones menos malas: Dcese que el conjunto O(f(n)) es el de las funciones de orden de f(n), que se define como
O(f(n))= {g: INTEGER -> REAL+ tales que existen las constantes k y N0 tales que para todo N > N0, g(N) <= k*f(N) }

en palabras, O(f(n)) esta formado por aquellas funciones g(n) que crecen a un ritmo menor o igual que el de f(n). De las funciones "g" que forman este conjunto O(f(n)) se dice que "estn dominadas asintticamente" por "f", en el sentido de que para N suficientemente grande, y salvo una constante multiplicativa "k", f(n) es una cota superior de g(n).

Вам также может понравиться