Está en la página 1de 6

ANALISIS DE ALGORITMOS

No depende de lenguajes de Programación ni de Hardware. Elección de algoritmos


EFICIENTES (tiempo, memoria)
- Necesito:
 Conocer la complejidad del problema
 Conocer el tamaño de la entrada (número de elementos)
 Determinar el número de operaciones a realizar
 La complejidad de un algoritmo se representa a través de una
 función matemática
Análisis del peor caso (fácil). Tiempo de ejecución: cota superior de toda entrada n.
Constantes/ términos de menor orden no influyen. Dichas ctes dependen de la
arquitectura del compilador. Prácticamente no se pierde poder predictivo.
Análisis asintótico: enfoque en entradas GRANDES. Log n es mejor que n^2
Un algoritmo es VELOZ cuando la ejecución del peor caso crece más lento q el
tamaño de la entrada.
T(n) = O(f(n)) (lineal) si eventualmente T(n) esta acotado superiormente x una cte
múltiplo de f(n)
Definición: T(n) =  (f(n)) sii existen constantes c, n0 tales que T(n) ≥ c. f(n) n ≥n0
Definición: T(n) =  (f(n)) sii T(n) = O(f(n)) y T(n) =  (f(n))
Ordenamiento y organización de datos: estructuras
Se elige siempre la mínima estructura de datos q alcance a darnos soporte.
Grafos
El máximo número de arcos o aristas de un grafo de n nodos es:

➤ n ·(n−1)/2, si es un grafo no dirigido

➤ n ·(n−1), si es un grafo dirigido


El algoritmo de Dijsktra (nodos) es voraz
 Mientras que sea posible, se eligen arcos (u,v) con u explorado y v no. Se
prueba por inducción en el número de las iteraciones. Por fuerza bruta, si se
quieren realizar combinaciones de 500 caracteres de ADN, las combinaciones
posibles son 10^125 ya q 500/4 (bases)= 125
Notación Asintótica
El orden de crecimiento del algoritmo conforme el tamaño de la entrada se acerca al
límite
Un problema está BIEN resuelto si existe un algoritmo de complejidad polinomial para
el problema.
Usualmente el algoritmo asintóticamente más eficiente es la mejor opción, excepto para
entradas muy pequeñas (Como el algoritmo de Fibonacci con programación dinámica
de Franco)
O (2^n), ya con n=40 tarda DIAS. Es incluso peor q O(n^5)
Propiedades de O
Para cualquier función de f se tiene que f ∈ O(f).
 f ∈ O(g) ⇒ O(f) ⊂ O(g).
 O(f) = O(g) ⇔ f ∈ O(g) y g ∈ O(f).
 Si f ∈ O(g) y g ∈ O(h) ⇒ f ∈ O(h).
 Si f ∈ O(g) y f ∈ O(h) ⇒ f ∈ O(min(g,h)) . EN CONTRASTE CON OMEGA:
 Si f ∈ Ω(g) y f ∈ Ω(h) ⇒ f ∈ Ω(max(g,h))
 Regla de la suma: Si f1 ∈ O(g) y f2 ∈ O(h) ⇒ f1 + f2 ∈ O(max(g,h)).
 Regla del producto: Si f1 ∈ O(g) y f2 ∈ O(h) ⇒ f1 • f2 ∈ O(g • h) . //Las mismas p tita y
Omega.

 lim 𝑛→∞ 𝑓(𝑛)/ 𝑔(𝑛) = 𝑘,

 Si k ≠ 0 y k < ∞ entonces O(f) = O(g), y f (N) ⊂ Ө(g(N))


 Si k = 0 entonces f ∈ O(g), es decir, O(f) ⊂ O(g), pero sin embargo se verifica
 que g ∉ O(f) // Lo MISMO con Omega.
// Con tita Si k = 0 entonces los órdenes exactos de f y g son distintos.
Orden Lineal O(n)  tiempo de ejecución proporcional al tamaño de la entrada
(calcular max)
Orden Cuadrático O(n^2)  enumerar todas las parejas posibles de elementos en un
conjunto (for en for)  encontrar puntos más cercanos xy
Orden Logarítmico  O(log n) O (n log n) son CASI lineales. Dividir y Conquistar p ej,
Orden exponencial O(2^n)  Combinatoria. Subconjuntos d 1 conjunto

ALGORITMOS VORACES
 Permiten construir soluciones razonables pero suboptimas
 Se usan p problemas de optimización con información incompleta
 Por ejemplo, con esta estrategia se atiende 1ero a los clientes q tengan menor
tiempo de atención
En contraste a Dividir y Conquistar:
 Es más sencillo proponer voraces, el análisis de tiempo es más fácil, pero es
difícil establecer correctitud
DIVIDIR Y CONQUISTAR

Dividir I en sub-instancias I1,..lk más pequeñas.
 Resolver recursivamente las k sub-instancias.
 Combinar las soluciones para las k sub-instancias para obtener una solución
para la instancia original
Si se quiere buscar los pesos máximos, pero si hay conflicto con soluciones
intermedias, no está claro cómo resolverlo con dividir y conquistar.
BACKTRACKING
Técnica p recorrer sistemáticamente todas las posibles configuraciones de un espacio
asociado a soluciones candidatas de un problema computacional. Se usa un vector p
representar una solución. Se extienden las soluciones candidatas agregando un
elemento más al final del vector ‘a’, las nuevas soluciones candidatas son sucesoras de
la anterior.
Ejemplo: Problema de las 9 reinas. Las combinaciones de su disposición son ( 64 c 8 )
–combinatoria.

PROGRAMACION DINAMICA
Problemas de optimización-> varias soluciones, elegimos la + optima. El problema se
divide en subproblemas menores, y luego se combinan las soluciones obtenidas p
generar la solución original.
EL ejemplo es el de la multiplicación de matrices.

TIEMPO DE EJECUCION
Hay dos maneras de estimar el tiempo de ejecución:
 Análisis empírico: se mide el tiempo de respuesta para distintos juegos de
datos. Afectada x la potencia del equipo. Presentan variaciones s/ características
de los datos de entrada
 Análisis teórico: se calculan el número de comparaciones y asignaciones que
efectúa el algoritmo
Factores que influyen en el uso de recursos
Recursos computacionales:
 ◦ diseño del algoritmo
 ◦ Complejidad del problema (tamaño de las entradas)
 ◦ Hardware (arquitectura, MHz, MBs…)
 ◦ Calidad del código
 ◦ Calidad del compilador (optimizaciones)
Recursos no computacionales:
 ◦ Complejidad del algoritmo
 ◦ Disponibilidad de bibliotecas reutilizables

EFICIENCIA: Es la medida del uso de los recursos computacionales requeridos por la


ejecución de un algoritmo en función del tamaño de las entradas.
Principio de INVARIANZA: 2 implementaciones de un MISMO algoritmo no diferirán en
tiempo de ejecución + q en una constante multiplicativa
En un FOR: se tiene en cuenta las condiciones distintas en las q va entrando a la hora
de sacar el tiempo total de ejecución.
Tiempo de una función RECURSIVA: Es también Recursivo
 Si una Función recursiva es como un for, como la factorial, es O(n). Ya si hay
varias llamadas a la función dentro de la recursión, Fibonacci, es más
complicado
 T(n) = T(n-1) +f(n)

Reglas de la SUMA y Multiplicación para Tiempo de Ejecucion T(N)
 T1(N) + T2 (N) = O(f (N) + g(N))
 T1(N) ∗ T2 (N) = O(f (N) ∗ g(N))
Si T(N) es un polinomio de grado k, entonces T(N) = Ө(N^k )
Busqueda binaria O(log n)
1. Encontrar X en array ordenado.
2. Si X< Elemento del Medio. Aplicamos la misma estrategia a la sublista Izquierda
ORDENADA
3. Si X> El medio, me voy para la derecha y voy cortando a la mitad así la lista
The Optimal Catching Algorithm
Belady 1960: El algoritmo optimo es el que quita la página q se usara en el futuro más
lejano.
Tengo muchas tareas para ser ejecutadas. Cada tarea tarda un tiempo Cj, suma de las
tareas anterioes
Si tengo prioridad w, y tiempo C, la suma ponderada de los tiempos de completitud, es
Wi . Ci + w ii . C ii (..)
Analisis de grafos
Distintas alternativas a un viaje, según el clima. Se hacen ponderaciones: cant
estaciones de servicio, nieve, terreno.
Grafo de Transiciones: Maquina de Estados.
 Recibo una letra, y cambio de estado.
La expresión abbbaaa es una expresión valida del lenguaje si tiene un inicio en 0 y final
en 3 (último nodo)
A veces los arcos no nos progresan hacia la solución, hay que evitar tomarlos.
Ciclo: es un camino en el cual el primer y último vértice son iguales. Si el camino es
simple se llama ciclo simple.
Longitud de un camino: número de aristas del camino= n de nodos-1
Etiquetado si cada artista tiene asociado un valor.
Un grafo es conexo si hay un camino entre cualquier par de vértices. Dirigido=
fuertemente conexo.
Un nodo es terminal si tiene conexiones de entrada pero no de salida
(..)
Representacion de grafos:
- Matrices de adyacencia cuadradas, nodos en columnas y filas y voy colocando
1 o 0 según están conectados entre si o no
- Si el grafo no es dirigido, la matriz es simétrica.
- Entoces almaceno la triangular superior, porq es igual a la inferior. Si tengo
muchos nodos, eso sirve para ahorrar espacio
Grafos con valores infinitos: se usa el infinito en la matriz de adyacencia para indicar
que esa transición NO es posible.
Listas de adyacencia: Es una alternativa a las matrices, que utiliza menos memoria.
Si están todas las celdas llenas, es preferible usar una matriz x cuestión de
facilidad.
Tipos de recorridos
 Depth First (Para abajo). El problema es q quizás la solución estaba al lado y
nunca la encontró.
 Breadth First (Hermano a los lados). Como recorre TODAS las alternativas, va a
encontrar la solución si o si.
ARBOLES
Arboles de expansión de costo mínimo. Una estrategia voraz busca los óptimos locales,
osea que elegiría lo más barato en cada trayecto.
Problema de las computadoras (nodo estrella): 1/2/3/6/5/3 voraz; con 1 backtracking en
el tercer nodo, en lugar de elegir costo 2 elegimos costo 3
Estructura del algoritmo de Prim: No lo toma. Costo cuadrático
 Grafo no direccionado.
Algoritmo de Kruskal: Busca la solución en un grafo todo conectado. Costo O(n log n).
 A medida q encuentra un enlace une las aristas
Camino Mínimo de Grafos:
 Consiste en hallar la mejor forma de ir de un punto a otro. Quiero ir de Bs As a
Bahía blanca. Arma un nodo y se arma la lista y matriz de adyacencia
 BFS: Breaadth First. Algoritmo de dijkstra (q no contempla pesos negativos)
 El algoritmo de dijsktra sirve para grafos NO direccionados

También podría gustarte