clasificacion de los problemas

5
Complejidad de Algoritmos ¿Cuándo proporciona un algoritmo una solución SATISFACTORIA a un problema? Primero, debe producir siempre la respuesta correcta. Segundo, deberá ser eficiente. ¿Cómo se puede analizar la eficiencia de los algoritmos? Una medida de eficiencia es el tiempo que requiere un ordenador para resolver un problema utilizando un algoritmo para valores de entrada de un tamaño específico. Una segunda medida es la cantidad de memoria que se necesita de nuevo para valores de entrada de un tamaño dado. Una tercera medida sería estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente los elementos con claves iguales. Un análisis del tiempo requerido para resolver un problema de un tamaño particular está relacionado con la complejidad en tiempo del algoritmo y un análisis de la memoria de ordenador requerida involucra la complejidad en

Upload: sergio-ormeno

Post on 30-Jul-2015

121 views

Category:

Documents


1 download

TRANSCRIPT

Complejidad de Algoritmos¿Cuándo proporciona un algoritmo una solución SATISFACTORIA a un problema?

Primero, debe producir siempre la respuesta correcta. Segundo, deberá ser eficiente.

¿Cómo se puede analizar la eficiencia de los algoritmos?

Una medida de eficiencia es el tiempo que requiere un ordenador para resolver un problema utilizando un algoritmo para valores de entrada de un tamaño específico. Una segunda medida es la cantidad de memoria que se necesita de nuevo para valores de entrada de un tamaño dado. Una tercera medida sería estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente los elementos con claves iguales.

Un análisis del tiempo requerido para resolver un problema de un tamaño particular está relacionado con la complejidad en tiempo del algoritmo y un análisis de la memoria de ordenador requerida involucra la complejidad en espacio del algoritmo. Obviamente, es importante saber si un algoritmo producirá su respuesta en un milisegundo, en un minuto o en un millón de años y de manera similar debemos tener suficiente memoria disponible para poder resolver el problema.

Las consideraciones sobre complejidad en espacio están ligadas a las estructuras de datos usadas en la implementación del algoritmo.

La complejidad en el tiempo de un algoritmo se puede expresar en términos del número de operaciones que realiza el algoritmo cuando los datos de entrada tienen un tamaño particular. (comparación de enteros, sumas, multiplicaciones, etc.)

La complejidad se describe en términos del número de operaciones requeridas en lugar del tiempo de cálculo real, debido a que distintos ordenadores necesitan tiempos diferentes para realizar las mismas operaciones básicas. Cada algoritmo se comporta de modo diferente de acuerdo a cómo se le entregue la información; por eso es conveniente estudiar su comportamiento en casos extremos, como cuando los datos están prácticamente ordenados o muy desordenados.

Complejidad del peor caso.- Por comportamiento de un algoritmo en el peor caso entendemos el mayor número de operaciones que hace falta para resolver el problema dad utilizando el algoritmo para unos datos de entrada de un determinado tamaño. Los análisis del peor caso nos dicen cuántas operaciones tienen que realizar los algoritmos para garantizar que producirán una solución.

Complejidad del caso promedio.- En este tipo de análisis de complejidad se busca el número promedio de operaciones realizadas para solucionar un problema considerando todas las posibles entradas de un tamaño determinado. El análisis de la complejidad del caso promedio es generalmente mucho más complicado que el análisis del peor caso.

La complejidad del algoritmo se denota según la notación Big-O.

Las expresiones Big-O no tienen constantes o términos de orden bajo. Esto se debe a que cuando N es muy grande, las constantes y los términos mas bajos no existen (un método constante será más rápido que uno lineal y este será más rápido que uno cuadrático).

Por ejemplo, O(n) significa que el algoritmo tiene una complejidad lineal. En otras palabras, toma 10 veces más tiempo en operar un set de 100 datos que en hacerlo con un set de 10 items. Si la complejidad fuera O(n2) entonces tomaría 100 veces más tiempo en operar 100 items que en hacerlo con 10.

Complejidad TerminologíaO(1) Complejidad constanteO(log n) Complejidad logarítmicaO(n) Complejidad linealO(n log n) Complejidad n log nO(n^b) Complejidad polinómicaO(b^n) Complejidad exponencialO(n!) Complejidad factorial

Problemas Tratables, Intratables y NP-completos

Clase P.- Los algoritmos de complejidad polinómica se dice que son tratables en el sentido de que suelen ser abordables en la práctica. Los problemas para los que se conocen algoritmos con esta complejidad se dice que forman la clase P. Aquellos problemas para los que la mejor solución que se conoce es de complejidad superior a la polinómica, se dice que son problemas intratables.

Clase NP.- Algunos de estos problemas intratables pueden caracterizarse por el curioso hecho de que puede aplicarse un algoritmo polinómico para comprobar si una posible solución es válida o no. Esta característica lleva a un método de resolución no determinista consistente en aplicar heurísticos para obtener soluciones hipotéticas que se van desestimando (o aceptando) a ritmo polinómico. Los problemas de esta clase se denominan NP (la N de no-deterministas y la P de polinómicos).

Clase NP-completos.- Se conoce una amplia variedad de problemas de tipo NP, de los cuales destacan algunos de ellos de extrema complejidad. Gráficamente podemos decir que algunos problemas se hayan en la "frontera externa" de la clase NP. Son problemas NP, y son los peores problemas posibles de clase NP. Estos problemas se caracterizan por ser todos "iguales" en el sentido de que si se descubriera una solución P para alguno de ellos, esta solución sería fácilmente aplicable a todos ellos. Actualmente hay un premio de prestigio equivalente al Nobel reservado para el que descubra semejante solución.

El algoritmo requiere menos de O(n²) comparaciones y cambios en el pero caso. Aunque es fácil desarrollar intuitivamente el sentido de cómo funciona el algoritmo, es bastante difícil analizar su tiempo de ejecución pero los estimados difieren entre O(nlog2n) a O(n1.5) dependiendo de los detalles de implementación

Dependiendo en la elección de la secuencia de saltos, Shell sort a probado tener un tiempo de ejecución en el peor caso igual a O(n2), O(n3/2), O(n4/3) o O(nlog2n) o posiblemente mejores tiempos de ejecución aún no probados. La existencia de una implementación que tenga una complejidad O(nlogn) en el peor caso para el Shell sort aún se mantiene como una pregunta abierta a la investigación.

El tamaño del set de datos usado tiene un impacto significativo en la eficiencia del algoritmo. Algunas implementaciones de este algoritmo tienen una función que permite calcular el tamaño óptimo del set de datos para un array determinado.

La secuencia de salto que fue sugerida inicialmente por Donald Shell fue comenzar con N/2 y posteriormente disminuir a la mitad el salto hasta que llegue a 1. Esta secuencia provee una mejora de desempeño sobre los algoritmos cuadráticos como el método por inserción pero puede ser cambiada levemente para disminuir aún mas el tiempo de ejecución en el peor y el caso promedio.