Escolar Documentos
Profissional Documentos
Cultura Documentos
Tipos de Datos Abstractos (TDAs) Pilas (Stacks) Aplicacin al anlisis de una serie de tiempo Implementacin Java de una pila Interfaces y excepciones
Por ejemplo, si se modela una bolsa de caramelos como un TDA, se puede especificar que:
este TDA almacena caramelos este TDA permite poner un caramelo y extraer un caramelo.
Hay una gran cantidad de TDAs formalizados y estndar. En lo sucesivo se mostrarn varios TDAs estndar diferentes (pilas, colas, rboles...)
Pilas (Stacks)
Una pila es un contenedor de objetos que se insertan y extraen de acuerdo al principio de ltimo en entrar, primero en salir (last-infirst-out, LIFO). Los objetos se pueden insertar en cualquier momento, pero slo el ltimo (el insertado ms reciente) objecto puede ser extrado. La insercin de un elemento se conoce como pushing en la pila. Popping de la pila es sinnimo de extraer un elemento.
Un Algoritmo Ineficiente
Hay una forma directa de calcular el lapso de una accin de n das:
Algoritmo calculaLapso1(P): Input: un array de nmeros P de n-elementos tal que P[i] es el precio de la accin en el da i Output: un array de nmeros S de n-elementos tal que S[i] es el lapso de la accin en el da i for i 0 to n - 1 do k 0 done false repeat if P[i - k] P[i] then k k + 1 else done true until (k = i) or done S[i] k return S
Un Algoritmo Eficiente
El cdigo para el nuevo algoritmo es:
Algoritmo calculaLapso2(P): Input: un array de nmeros P de n-elementos que representan los precios de la accin Output: un array de nmeros S de n-elementos tal que S[i] es el lapso de la accin en el da i Sea D una pila vaca for i 0 to n - 1 do k 0 done false while not(D.isEmpty() or done) do if P[i] ?? P[D.top()] then D.pop() else done true if D.isEmpty() then h -1 else h D.top() S[i] i - h D.push(i) return S
Implementacin Java
Dado el TDA pila, necesitamos codificar el TDA para usarlo en los programas. Es necesario primero entender dos constructores de programas: interfaces y exceptions. Una interface es una forma de declarar lo que hace una clase. No menciona cmo lo hace.
Para una interface, se escriben los nombres de los mtodos y los parmetros. Cuando se especifican parmetros, lo que realmente importa son sus tipos. Despus, cuando se escribe una class para esa interface, se codifica el contenido de los mtodos. La separacin de interface e implementation es una tcnica de programacin muy til.
Ejemplo de Interface:
10
// metodos de actualizacion public void push (Object element); public Object pop() throws StackEmptyException; }
11
Excepciones
Excepciones son otra construccin de programacin, tiles para el manejo de errores. Cuando se encuentra un error (o un caso excepcional), se lanza (throw) una excepcin. Ejemplo public void comerPizza() throws DolorEstomagoException {... if (comeDemasiado) throw new DolorEstomagoException(Duele); ...} Tan pronto como una excepcin se lanza, el control del flujo sale del mtodo en curso. As, cuando se lanza DolorEstomagoException, se sale del mtodo comerPizza() y se va donde se invoca el mtodo.
12
Ms Excepciones
En el siguiente cdigo se llama al mtodo comerPizza() en primer lugar.
private void simulaReunion() {... try { asistenteConHambre.comerPizza(); } catch(DolorEstomagoException e) { System.out.println(alguien tiene dolor de estomago); } ...}
13
Ms sobre Excepciones
Se retorna a asistenteConHambre.comerPizza(); porque comerPizza() lanza una excepcin. El bloque try - catch significa que atiende las excepciones que se especifican en el parmetro catch. Debido a que catch atiende DolorEstomagoException, el flujo de control ir al bloque catch. Por tanto System.out.println se ejecutar. Notar que el bloque catch puede contener cualquier cosa adems de System.out.println. Se puede manejar el error atendido en la forma que se desee; incluso se puede lanzar nuevamente con throw. Notar que si en algn sitio de un mtodo se lanza una excepcin, se necesita aadir la clusula throws a continuacin del nombre del mtodo.
14
Ms sobre Excepciones
Qu es importante en el uso de excepciones? Se puede delegar hacia arriba la responsabilidad del manejo de errores. La delegacin hacia arriba significa dejar al cdigo que llam al cdigo en curso trate el problema. Si nunca se atiende una excepcin con catch, se propagar hacia arriba a lo largo de la cadena de mtodos de llamada hasta que el usuario lo vea.
15
Ms sobre Excepciones
Podemos lanzar y atender excepciones. En Java son Clases. Verificar Dolor EstomagoException.
NOTE: Los ndices delArray empiezan en 0, por lo que se inicializa t a -1 Pseudocdigo en la derecha.
Algoritmo size(): return t +1 Algoritmo isEmpty(): return (t < 0) Algoritmo top(): if isEmpty() then throw a StackEmptyException return S[t] ...
17
Pseudocdigo
Algoritmo push(o): if size() = N then throw a StackFullException tt+1 S[t] o Algoritmo pop(): if isEmpty() then throw a StackEmptyException e S[t] S[t] null t t-1 return e
18
Algorithm pop(): if isEmpty() then throw a StackEmptyException e S[t] S[t] null t t-1 return e
19
public ArrayStack(int cap) { // Initializa la pila con la capacidad dada capacity = cap; S = new Object[capacity];}
20
22
Ms sobre Pilas
Pilas que crecen Anlisis Amortizado Pilas en la JVM (Java virtual machine)
23
En lugar de generar un StackFullException, se puede reemplazar el array S con uno ms grande para continuar procesando las operaciones push.
Algoritm push(o): if size() = N then A new array of length f(N) for i 0 to N - 1 A[i] S[i] S A t t + 1 S[t] o
25
27
Estrategia Creciente
Empieza con una array de tamao 0, entonces crece 1, 2, 4, 8, ... El costo de un push especial es 3N + 1 para N>0
push 1 2 3 4 5 6 7 8 9 10 11 12 ... 16 17 fase 0 1 2 2 3 3 3 3 4 4 4 4 ... 4 5 n 0 1 2 3 4 5 6 7 8 9 10 11 ... 15 16 N 0 1 2 4 4 8 8 8 8 16 16 16 ... 16 16 costo 2 4 7 1 13 1 1 1 25 1 1 1 ... 1 49
28
Anlisis Amortizado
El tiempo de ejecucin amortizado de una operacin dentro de una serie de operaciones es el tiempo de ejecucin en el peor de los casos de la serie de operaciones completa, dividido por el nmero de operaciones. El mtodo contable determina el tiempo de ejecucin amortizado con un sistema de crditos y dbitos Para ello se modela el computador como una mquina operada con monedas que requiere un cyber-dlar para una cantidad constante de tiempo de ejecucin.
Se configura un esquema para cargar operaciones. Esto se conoce como esquema amortizado. Se puede sobrecargar y subcargar otras operaciones. Por ejemplo, se puede cargar cada operacin con la misma cantidad. El esquema siempre provee del suficiente dinero para pagar el costo actual de la operacin. El costo total de las series de operaciones no es ms que la cantidad total cargada.
30
$ $ $ $ $
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Se carga $7 para un push. Los $6 ahorrados para un push regular se guardan en la segunda mitad del array.
31
32
Java tambin incluye una pila de operandos que se usa para evaluar instrucciones aritmticas, p.e.
Integer add(a, b): OperandStack Op Op.push(a) Op.push(b) temp1 Op.pop() temp2 Op.pop() Op.push(temp1 + temp2) return Op.pop()
34
35