Teoría de la complejidad Algorítmica
En la ciencia de
la computación los algoritmos son
más importantes que los LP o que las computadoras;
la solución de un problema haciendo uso de las
computadoras requiere por una parte un algoritmo o
método de
resolución y por otra un programa o
codificación del algoritmo en un LP. Ambos
componentes tienen importancia; pero la del algoritmo es
absolutamente indispensable; sabemos que un algoritmo es una
secuencia de pasos para resolver un problema, sus
características son:
- Independiente: Del LP y de la máquina.
- Definido: De pasos claros y concretos.
- Finito: En el número de pasos que usará.
- Preciso: Cada paso arroja un cálculo correcto.
- Recibe datos: Debe poseer datos de entrada.
COMPLEJIDAD ALGORÍTMICA
- Un algoritmo será mas eficiente comparado con otro, siempre que consuma menos recursos, como el tiempo y espacio de memoria necesarios para ejecutarlo.
- La eficiencia de un algoritmo puede ser cuantificada con las siguientes medidas de complejidad:
Complejidad Temporal
o Tiempo de ejecución: Tiempo de
cómputo necesario para ejecutar algún
programa.
Complejidad
Espacial: Memoria que utiliza un programa para su
ejecución,
La eficiencia en memoria de un algoritmo
indica la cantidad de espacio requerido para ejecutar el
algoritmo; es decir, el espacio en memoria que ocupan todas
las variables propias al algoritmo. Para
calcular la memoria estática de un algoritmo
se suma la
memoria que ocupan las variables declaradas en el
algoritmo. Para el caso de la memoria
dinámica, el cálculo no es tan simple ya
que, este depende de cada ejecución del
algoritmo.
- Este análisis se basa en las Complejidades Temporales, con este fin, para cada problema determinaremos una medida N, que llamaremos tamaño de la entrada o número de datos a procesar por el programa, intentaremos hallar respuestas en función de dicha N.
- El concepto exacto que cuantifica N dependerá de la naturaleza del problema, si hablamos de un array se puede ver a N como el rango del array, para una matriz, el número de elementos que la componen; para un grafo, podría ser el número de nodos o arcos que lo arman, no se puede establecer una regla para N, pues cada problema acarrea su propia lógica y complejidad.
Órdenes de
Complejidad
- La familia O(f(n)) define un Orden de Complejidad. Elegiremos como representante de este Orden de Complejidad a la función f(n) más sencilla perteneciente a esta familia.
- Las funciones de complejidad algorítmica más habituales en las cuales el único factor del que dependen es el tamaño de la muestra de entrada n, ordenadas de mayor a menor eficiencia son:
O(1) |
Orden
constante |
O(log
n) |
Orden
logarítmico |
O(n) |
Orden
lineal |
O(n log
n) |
Orden
cuasi-lineal |
O(n2) |
Orden
cuadrático |
O(n3) |
Orden
cúbico |
O(na) |
Orden
polinómico |
O(2n) |
Orden
exponencial |
O(n!) |
Orden
factorial |
- Se identifica una Jerarquía de Ordenes de Complejidad que coincide con el orden de la tabla mostrada; jerarquía en el sentido de que cada orden de complejidad inferior tiene a las superiores como subconjuntos.
-
- O(1): Complejidad constante. Cuando las instrucciones se ejecutan una vez.
- O(log n): Complejidad logarítmica. Esta suele aparecer en determinados algoritmos con iteración o recursión no estructural, ejemplo la búsqueda binaria.
- O(n): Complejidad lineal. Es una complejidad buena y también muy usual. Aparece en la evaluación de bucles simples siempre que la complejidad de las instrucciones interiores sea constante.
- O(n log n): Complejidad cuasi-lineal. Se encuentra en algoritmos de tipo divide y vencerás como por ejemplo en el método de ordenación quicksort y se considera una buena complejidad. Si n se duplica, el tiempo de ejecución es ligeramente mayor del doble.
- O(n2): Complejidad cuadrática. Aparece en bucles o ciclos doblemente anidados. Si n se duplica, el tiempo de ejecución aumenta cuatro veces.
- O(n3): Complejidad cúbica. Suele darse en bucles con triple anidación. Si n se duplica, el tiempo de ejecución se multiplica por ocho. Para un valor grande de n empieza a crecer dramáticamente.
- O(na): Complejidad polinómica (a > 3). Si a crece, la complejidad del programa es bastante mala.
- O(2n): Complejidad exponencial. No suelen ser muy útiles en la práctica por el elevadísimo tiempo de ejecución. Se dan en subprogramas recursivos que contengan dos o más llamadas internas. N
Enlaces para el material =(PDF)=: Link Seguro, Links Alternativo.
Fuente: Monografias
Paginas relacionadas: Literaturas y otras cuestiones morales, Ceo Developers, Geniality Software.
Nota: Si el material te ha servido de ayuda por favor comparte el post, necesitamos que aumente el numero de personas que conocen acerca de estos temas, estamos en la revolucion informatica y todos debemos poner un poco de nuestra parte, para que este movimiento nunca muera. Unidos por la informatica.
No hay comentarios:
Publicar un comentario
Si tienes alguna duda, escribenos.