Análisis temporal
Casos de entrada
Un caso de entrada para un algoritmo es una instancia del problema inicial.
Un algoritmo para resolver un problema de tamaño n, puede recibir una o más entradas, las cuales pueden definir el número de operaciones que hará.
Se puede determinar que tipos de operaciones utiliza y cuantas veces las ejecuta para una entrada e específica k
Por ejemplo realizar una busqueda lineal del 40 en un arreglo de 100,000 elementos (n=100,000)
Ejemplo 1. Búsqueda lineal
Un algoritmo para resolver un problema de tamaño n, puede recibir una o más entradas, las cuales pueden definir el número de operaciones que hará.
Se puede determinar que tipos de operaciones utiliza y cuantas veces las ejecuta para una entrada e específica k
Por ejemplo realizar una busqueda lineal del 40 en un arreglo de 100,000 elementos (n=100,000)
Ejemplo 1. Búsqueda lineal
Operación básica
Del ejemplo notamos que el número de veces que se ejcutan algunas operaciones, para valores sucesivamente mayores que j y/o n; se presenta un modelo de crecimiento similar al que tiene el numero total de operaciones que ejecuta.
Para hacer una estimación de la cantidad de tiempo que tarda un algoritmo en ejecutarse, no es necesario contar el número total de operaciones que realiza
Se puede elegir alguna, a la que se identificará como operación básica que observe un comportamiento parecido al del número total de operaciones realizadas y que, por lo tanto, será proporcional al tiempo total de ejecución.
En general, debe procurarse que la operación básica, en la cual se basa el análisis, de alguna forma esté relacionada con el tio de problema que se intenta resolver, ignorando las asignaciones de valores iniciales y las operaciones sobre variables para control de ciclos (índices)
Ejemplo 2. Producto de 2 mayores
El algoritmo siguiente obtiene el producto de los dos valores más grandes contenidos en un arreglo A de n enteros.
En este algoritmo se realizan las siguientes operaciones:
a) Comparación con los elementos del arreglo
b) Asignaciones a mayor1 y mayor2
c) Asignación al índice i
d) Asignación a la función
e) Producto de los mayores
f) Incremento al índice i
g) Comparación entre el índice i y la longitud del arreglo n
Las operaciones (c), (f) y (g) no se consideran por realizarse entre índices, las operaciones (d) y (e) se ejecutan una sola vez y no son proporcionales al número total de operaciones.
Entones, se tiene que las operaciones que se pueden considerar para hacer el análisis son: (a) Comparación con los elementos del arreglo y (b) las asignaciones a los elementos mayores.
(c), (f), (g),(d) y (e) pueden omitirse para el análisis
(a) y (b) operaciones básicas del algoritmo.
Elección de la operación básica
El análisis d un algoritmo se puede hacer considerando sólo aquella operación que cumpla con los siguientes criterios:
a) Debe estar relacionada con el tipo de problema que se resuelve.
b) Debe ejecutarse un número de veces cuyo modelo de crecimiento sea similar al del número total de operaciones que efectúa el algoritmo.
Si ninguna de las operaciones encontradas cumple con ambos criterios, es posible declinar por el primero. Si aun así no es posible encontrar una operación representativa, se debe hacer un análisis global, contando todas las operaciones.
Elección de la operación básica para algunos problemas:
- Búsqueda de un elemento en un conjunto
- Comparación ente el valor y los elementos del conjunto
- Multiplicar dos matrices
- Producto de los elementos de las matrices
- Recorrer un árbol
- Visitar un nodo
- Resolver un sistema de ecuaciones lineales
- Suma y resta de las ecuaciones
- Ordenar un conjunto de valores
- Comparación entre valores
Concepto de Instancia
Un problema computacional consiste en una caracterización de un conjunto de datos de entrada, junto con la especificación de la salida deseada con base a cada entrada.
Un problema computacional tiene una o más instancias, que son valores particulares para los datos de entrada, sobre los cuales se puede ejecutar el algoritmo para resolver el problema; i.e. un caso específico de un problema
Ejemplo
El problema computacional de multiplicar dos
números enteros tiene, las siguientes instancias: multiplicar
345 por 4653, multiplicar 2637 por 10000, multiplicar -32341
por 12, etc.
Análisis Pero Caso, Mejor Caso y Caso Promedio
El comportamiento de un algoritmo puede variar
notablemente para diferentes instancias.
Suelen estudiarse tres casos para un mismo algoritmo: caso mejor, caso peor, caso medio.
Tipos de análisis:
• Peor caso: indica el mayor tiempo obtenido, teniendo en consideración todas las entradas posibles.
• Mejor caso: indica el menor tiempo obtenido, teniendo en consideración todas las entradas posibles.
• Caso medio: indica el tiempo medio obtenido, considerando todas las entradas posibles.
Suelen estudiarse tres casos para un mismo algoritmo: caso mejor, caso peor, caso medio.
Tipos de análisis:
• Peor caso: indica el mayor tiempo obtenido, teniendo en consideración todas las entradas posibles.
• Mejor caso: indica el menor tiempo obtenido, teniendo en consideración todas las entradas posibles.
• Caso medio: indica el tiempo medio obtenido, considerando todas las entradas posibles.
Retomando el Ejemplo 1. Búsqueda lineal
Problema. Encontrar la posición de un determinado número en un arreglo desordenado.
¿Cuales serían el peor caso, mejor caso y caso
promedio?
*Conclusión: Si se conociera la distribución de los datos, podemos sacar provecho
de esto, para un mejor análisis y diseño del algoritmo. Por otra parte, sino
conocemos la distribución, entonces lo mejor es considerar el peor de los casos.
Análisis Temporal (mejor, peor y caso medio)
Con los conceptos anteriores es posible llevar a cabo el
análisis temporal de un algoritmo i.e. calcular la función
complejidad temporal ft(n).
Considérese el Algoritmo del ejemplo 3 (Búsqueda lineal),
para hacer el análisis de su comportamiento:
Operación básica: Comparaciones con elementos del arreglo
Caso muestra: A = [2, 7, 4, 1, 3] y n = 5:
• Si Valor = 2, se hace una comparación, ft
(5) = 1
• Si Valor = 4, se hacen tres comparaciones, ft
(5) = 3
• Si Valor = 8, se hacen cinco comparaciones, y ft
(5) = 5
Del análisis anterior es posible descubrir que la función
complejidad temporal no es tal, en realidad es una relación,
ya que para un mismo tamaño de problema se obtienen
distintos valores de la función complejidad.
Para la mayoría de los algoritmos el número de operaciones
depende, no sólo del tamaño del problema, sino también de
la instancia específica que se presente (caso de entrada).
Sea:
I(n)={I1
, I2
, I3
, …, Ik
} el conjunto de instancias del problema de
tamaño n.
O(n)={O1
, O2
, O3
, …, Ok
} el conjunto formado por el número de
operaciones que un algoritmo realiza para resolver cada instancia.
Entonces, Oj es el número de operaciones ejecutadas para resolver
la instancia Ij
, para 1 ≤ j ≤ k.
Se distinguen tres casos en el valor de la función complejidad
temporal
El mejor caso se presenta cuando para un caso de entrada I1
a un problema de tamaño n; el algoritmo ejecuta el mínimo
número posible de operaciones.
El peor caso se presenta cuando para un caso de entrada I2
a
un problema de tamaño n; el algoritmo ejecuta el máximo
número de operaciones.
El caso medio se consideran todos los casos posibles para
calcular el promedio de las operaciones que se hacen
tomando en cuenta la probabilidad de que ocurra cada
instancia I3
.
Retomando el Ejemplo 1. Búsqueda lineal
Algoritmo: Búsqueda lineal
Problema: Búsqueda lineal de un valor en un arreglo de
tamaño n:
Tamaño del Problema: n = número de elementos en el
arreglo.
Operación básica: Comparación del valor con los
elementos del arreglo A[i]!=Valor.
Análisis Temporal
Mejor caso: ocurre cuando el valor es el primer elemento
del arreglo.
f
t
(n)= 1 (Una comparación A[i]!=Valor)
Peor caso: sucede cuando el valor es el ultimo en el arreglo
o no se encuentra en el arreglo.
f
t
(n)=n (n comparaciones A[i]!=Valor)
Caso medio:
f
t
(n)=1P(1) + 2P(2) + 3P(3) + 4P(4) +... + nP(n) + nP(n + 1)
Donde P(i) es la probabilidad de que el valor se encuentre en la
localidad i; (1 ≤ i ≤ n) y P(n + 1) es la probabilidad de que no esté
en el arreglo y el número que lo acompaña es la cantidad de
operaciones básicas para cada uno de ellos
Si se supone que todos los casos son igualmente probables
Retomando el Ejemplo 2. Productos Mayores
Algoritmo: Producto mayores.
Problema: Dado un arreglo de valores, encontrar el producto de los
dos números mayores.
Tamaño del Problema: n =número de elementos en el arreglo.
Operación básica: Comparasión con los elementos del arreglo y las
asignaciones a los elementos mayores.
Mejor caso: ocurre cuando el arreglo está ordenado
descendentemente (se realiza la primer comparación y dos
asignaciones, posteriormente solo se compara n-2 veces el if y n-2
veces el else if).
Peor caso: el arreglo está ordenado de manera ascendente (se realiza
la primer comparación y dos asignaciones, posteriormente solo se
compara n-2 veces el if y siempre se cumplirá por lo que hará 2(n-2)
asignaciones.
Caso medio: en este problema se tienen (|𝑈 |/𝑛) 𝑛! casos, donde U es el
conjunto del que se extraen los elementos del arreglo.
(|𝑈 |/𝑛)Determina el número de posibles conjuntos de n elementos del
conjunto U
𝑛! Determina el número de maneras de acomodar los n elementos
Para hacer el cálculo se deben de contar las operaciones que se harían en
cada caso. (Laborioso y complicado)
El algoritmo hace siempre una comparación al inicio y dos
asignaciones y en el interior del ciclo puede ser que se realice una
comparación con dos asignaciones, dos comparaciones con una
asignación o dos comparaciones y ninguna asignación; obsérvese que
para cada A[i] puede ser cierta una de tres aseveraciones:
• A[i] > mayor1: Se hace una comparación y dos asignaciones
• A[i]≤mayor1 && A[i]>mayor2: Se hacen dos comparaciones y una
asignación
• A[i]≤mayor1 && A[i]≤mayor2 : Se hacen dos comparaciones
Caso medio. Si cada caso tien la misma probabilidad de ocurrencia en promedio se harán:
Es importante mencionar que no todos los algoritmos
presentan casos que hacen variar la complejidad
temporal para un tamaño de problema especifico, y
resulta interesante tener una herramienta de análisis
para detectar cuándo se particionará el análisis en casos;
por el momento la única ayuda con la que se cuenta es
la intuición y preguntarse: ¿Se puede resolver el
problema de manera trivial para alguna instancia
específica?. Si la respuesta es afirmativa el algoritmo
tendrá casos, por lo que el problema de detección se
reduce a contestar esta “simple” pregunta.
Comentarios
Publicar un comentario