sábado, 2 de noviembre de 2013

Arboles.

1. Definición: Estructura de datos no lineales para organizar la información por niveles.

2. Utilidad: Organizar datos en estructuras jerárquicas (se diferencia entre elementos mayores y menores).

3. Aplicaciones: Las aplicaciones de los arboles pueden ser: organigrama, genealogía, directorios, expresiones aritméticas, ordenamiento y búsqueda.

4. Terminología : 
                           Árbol General:  compuesto por nodos que pueden tener una cantidad indeterminada de                                 descendientes.
     
                           
Figura numero 12
Niveles: determinados por la posición horizontal de los nodos, en el árbol anterior ay tres niveles el nodo de color amarillo es un nivel, los nodos de color azul es el segundo nivel, y los nodos de color rojo es el tercer nivel.  

Altura: cantidad de niveles (3).
peso: cantidad de hojas (7).

Implementacion.

Aprendimos en la clase dos maneras de realizar la implementacion de arboles, como son: 

1.  Estática (arreglos). 

Para la implementacion con arreglos es necesario tener dos vectores uno que guarde los datos y otro que almacene la posición del padre del dato por ejemplo se tiene el siguiente árbol:

Figura numero 13


2. Dinámicas (Nodos).

Para realizar la implementacion de un árbol con nodos a este se le debe realizar un cambio el cual se muestra en la figura numero 13.

Figura numero 14
Para realizar el árbol que se encuentra en la figura numero 13 con la implementacion de nodos se realiza de la siguiente manera.
Donde la variable r es la raíz. 

Apreciaciones importantes y Reflexión.

En la clase logramos aprender sobre una estructura de datos no lineal llamada árbol, pude llegar a la conclusión que de las dos implementaciones vistas la mas opcionada para mi opinión es la implementacion con nodos  porque se puede decir que la memoria no quedara el árbol corto, si en caso de que la implementacion sea con arreglos al momento que se llegue a la cantidad máxima de este no se podrá añadir mas información al árbol.







Recursividad 
Aplicaciones.

Las aplicaciones donde se pueden aplicar la  recursividad son:

Recorrido de estructuras no lineales

Formulas matemáticas: se puede aplicar la  recursividad en un algoritmo para una formula matemática donde el proceso iterativo es muy complejo un ejemplo de estos algoritmos es:

Crear una función en java donde se pueda calcular el factorial de un numero entero mayor o igual a cero.

Las  funciones recursiva son realizadas de la siguiente manera.
acceso modificador tipo/clase nombreMetodoRecursivo (parámetros) {
      if(condición para detener autollamado)
       // instrucciones
       nombreMetodoRecursivo (argumentos); // autollamado
}

Para realizar esta función o método debemos tener en cuenta que el factorial de un numero es otro numero que resulta de la siguiente formula n!=n*(n-1)! donde n es el numero y el carácter "!" tiene como significado factorial mediante un ejemplo tendremos mas claridad sobre el factorial. ejemplo: factorial de 5 : 5! = 5*4!   4!=4*3!;  3!=3*2!;  2!=2*1!;  1!=1*0!;  0!=1.

Remplazando cada factorial tenemos que 1!=1*0! = 1;  2!= 2*1! = 2;  3!=3*2!= 6;  4!=4*3!=24;  5! = 5*4! = 120. Como resultado final obtenemos 120, quiere decir que el factorial de 5 es 120.



Analizando el  método recursivo mediante la siguiente figura.

Figura numero 11

La pila anterior ilustrada en la Figura numero 11 es la que almacena las instrucciones pendientes por realizar, la primera llamada del método realizada en el método main fue de 5 este quedo a la espera del llamado que ahora se realizo con (num-1) y así con las demás llamadas hasta que n valga cero y retorne 1 para luego realizar las instrucción pendientes que se encuentran en la pila interna del sistema operativo.

Ejercicios, funciones recursivas para:
1. calcular potenciacion entre dos numero naturales.
2. mostrar los elementos de una lista enlazada simple (invertida).



En la clase anterior se muestran los dos métodos el primero es casi igual al ejemplo de el factorial siendo que   recibe dos parámetros el cual uno es la base y el otro es el exponente. El segundo método recibe una lista y no retorna,  lo que primero que se hace es poner la condición del autollamado y en la pila se van guardando las instrucción que quedan pendiente como son el System.out.println() de cada dato que tiene la lista, cuando termina el autollamado la pila interna del sistema operativo realiza las instrucciones que tiene almacenada.  



Apreciaciones importantes y reflexión.

Como se pudo dar cuenta en el  método recursivo anterior nos facilita la solución una formula matemática, y en pocas lineas de código, que realizada iterativa mente resultaría un poco mas compleja. Recordemos que los métodos recursivo tienen considerable consumo de memoria.

viernes, 25 de octubre de 2013

Colas circular

Colas circular y Recursividad.

Figura numero 10
Para  implementar una cola circular  debemos realizar unos cambios en la clase cola para el método de llena, y los metodos como poner y quitar. las modificaciones son:

llena: (frente==0&& fin==max-1)||(fin==frente-1)

poner: if(fin==max-1){
fin =0;
} else {
fin++;
}

quitar: if(frente==max-1){
frente =0;
} else {
frente++;
}

En la figura numero 10 se ilusta una cola circular con una variable v (vector) que apunta al objeto, el circulo que tiene la flecha tiene como obnjetivo mostrar en que sentido se va insertando en la cola.

Recursividad 

1. Definicion: propiedad de las funciones (metodos) de autollamarse, se constituye una alternativa de los procesos iterativos (for, while, do while).

2. Utilidad: cuando el proceso o solucion iterativa es compleja.

3. Aplicaciones: recorrido de estructuras no lineales, en algunas formulas matematicas.

4.    Recursividad Vs Iteracion.
Recursividad
Iteración
métodos
ciclos
Reducción de código máxima
Reducción de código mínima
Lógica simple
Puede ser muy complejo
Considerable consumo de memoria
Consumo mínimo de memoria

Apreciacion importante y reflexion.

La recursividad consume mas memoria por que en cada autollamado hace una copia de toda la funcion y es guardada el la pila para llamado a subprogramas.

Tener muy en cuenta que siempre que se pueda usar un algoritmo no recursivo resultaria mejor ya que se ejecuta mas rapidamente y ocupa menos memoria ram  .

jueves, 24 de octubre de 2013

Solucion Parcial Numero dos.


Solución Parcial Numero dos.

Figura numero 9

En el parcial realizado el día miércoles 16 de octubre año 2013 se evaluaron dos punto uno sobre cola y otro sobre pila.
primer punto : Desarrolle una función Java, para intercambiar los elementos de los extremos en una cola. solo se puede usar colas y variables simples, primitivas, Object y envolventes.

Solución.

public static void intercambiarExtremos(Cola c){
Object aux1;
Object aux2=null;
Cola <Object> q = new Cola<>();
aux1=c.quitar();
while(!c.vacia()){
aux2=c.quitar();
if(!c.vacia()){
q.poner(aux2);
}
}
c.poner(aux2);
while(!q.vacia()){
c.poner(q.quitar());
}
c.poner(aux1);
}

Segundo punto: Defina la clase Pila en base a la clase Lista.

public class PilaLista <T>{
Lista<T> l = new Lista ();
public PilaLista() {
}
public boolean vacia(){ return l.vacia(); }
public void poner(T dato){
l.insertarInicio(dato, null);
}
public T cima(){ l.reiniciar();
T dat = null;
if(!vacia()){
dat = l.infor();
} else {
System.out.println("Pila Vacia");
}
return l.infor();
} 
public T quitar(){
l.reiniciar();
T date = null;
if(!vacia()){
date = l.infor();
l.eliminar();
} else {
System.out.println("Pila Vacia");
}
return date;
}

public static void main (String ae []){
PilaLista <String> pl = new PilaLista();
pl.poner("Carlos");
pl.poner("jose");
pl.poner("mendoza");
pl.poner("torres");
pl.poner("Estudiante");
pl.poner("Sistema");
pl.poner("Informacion");

System.out.println("cima ->" + pl.cima());

while(!pl.vacia()){
System.out.print(" "+pl.quitar());
}
System.out.println();

}

Apreciaciones importantes y reflexión:

en el primer punto  declaramos dos variables de tipo Objecto una que guardara el primer dato que se encuentra en la cola, la otra guardara el ultimo dato que se encuentra en la cola, también es necesario una cola auxiliar que guardara los datos intermedios, se saca el primer dato cuando se realiza la siguiente instrucción aux1=c.quitar(); luego los demás datos son sacados mediante una estructura repetitiva guardándolos primero en la segunda variable auxiliar y  se va preguntando si la cola no se encuentra vacía en caso de que se cumpla se pone en q los datos que se van sacando.
cuando termina de sacar los datos la variable aux2 almacena en ella el ultimo dato y es almacenado inmediatamente en la cola original, se ponen los datos intermedios y por ultimo se coloca el dato que almacena aux1 que era el primero ahora pasara de ultimo.

En el segundo punto se mostró una pila en base a la clase lista, lo cual era una actividad que se dejo para afianzar en nuestro estudio.

Colas

Colas.

Figura numero 9

Es una regla que restringe las operaciones en las estructuras lineales a FIFO(First In First Out) primer elemento en ser almacenado, primero en ser procesado.

Utilidad: su utilidad es cuando los recursos que se requieren para un proceso están en menor cantidad que la demanda de uso de estos.

aplicaciones: cola de procesos, cola de impresión, simulación.

Operaciones: Básicas: poner y quitar.

 Auxiliares: vacía, llena.

Implementacion: Arreglos, Nodo/lista.

Arreglo: Para realizar la implementacion con arreglos es necesario declarar cuatro variables una vector  y tres de tipo int llamadas max, frente, fin. Los métodos son los siguientes:
poner: fin++;
              v[fin]=dato;
quitar: dato = v[frente];
                      frente++;
vacia: frente==-1;
llena fin==max-1;

Nodo: Para realizar la implementacion con nodo también es necesario declarar nada mas las  variables frente y fin, pero estas serán de tipo Nodo.
poner: fin.setSig(new Nodo(dato,null));
          fin = fin.getSig();
quitar: dato=frente.getDato();
          frente = frente.getSig();
vacía: frente==null;

En la Figura numero 9 se muestra gráficamente un vector comportase como una cola tenemos la variable v (vector), una variable de tipo int llamada max con una valor de 6 que es el valor total del vector, es necesario otra variable de tipo int llamada frente esta tendrá la función de tener la posición en que se encuentra el primer dato de la cola, y otra variable  también de tipo int con nombre fin que tendrá la posición del ultimo dato que se encuentra en la cola.

Apreciaciones importantes y reflexión:

se obtuvo habilidad para realizar la clase ColaVector porque al conocer la clase pila se facilito la enseñanza de esta nueva estructura de datos, y conocer las operaciones básicas que en ella se utilizan. 

Aplicacion de Pila. Expresiones Aritmeticas

Aplicación de Pila. Expresiones Aritméticas


Una de las aplicaciones de pila son las expresiones aritméticas  estas facilitan la evaluación quitando paréntesis y ordenando el orden de operación según  prioridad al hacer la evaluación. Existen expresiones Aritméticas como:

inflija: son las expresiones que tienen el operador en el medio.

prefija: son las que tienen el operadores antes.

posfija: son las que tienen el operadores después.

Para realizar la aplicación de las expresiones aritméticas en pila es necesario pasar las expresiones inflijas a  prefijas y posfija. 
para realizarlo se guarda en una pila los operando  al encontrar un operador se sacan de la pila dos operando se realiza la operación y se guarda en la pila el resultado como se muestra en la figura numero 8.

Figura numero 8

Ejercicio de Expresiones Aritméticas conversión de inflijas a prefijas y posfijas. 
1. a+b*c^1/2 
Para convertir cualquier expresión aritmética inflija a prefija se necesita conocer sobre cual operador tiene mas prioridad cuales tienen iguales y cual tiene menor prioridad, al momento de convertir si nos encontramos con dos operadores que tienen iguales prioridades se realiza primero el operador que este mas a la izquierda, conociendo esto pasaremos a la conversión.
prefijas 

a+b*^c1/2   se paso el operador de el exponente ya que tiene mas prioridad de todos los operadores  y como la vamos a convertir a prefija se pasa el operador adelante de c.
a+*b^c1/2
a+/*b^c12
+a/*b^c12 resultado.
  posfijas
a+b*c^1/2  
a+b*c1^/2
a+bc1^*/2  
abc1^*2/+ resultado.

Ejercicios lógica de pilas

Función o métodos para:

1. Eliminar el primer elemento.
2.  Intercambiar los elementos de los extremos.
3. Eliminar elementos repetidos en forma consecutiva.

Métodos:

1.  

public void eliminarPrimero(Pila p){
T d = null;
d=((T) p.quitar());
while(!p.vacia()){
System.out.println(p.quitar());
}
}

2.  

public static void intercambiarElementosExtremos(Pila p){
Pila q,r;
q=new Pila <> ();
q.poner(p.quitar());
r= new Pila();
while(!p.vacia()){
r.poner(p.quitar());
}
p.poner(q.quitar());
q.poner(r.quitar());
while(!r.vacia()){
p.poner(r.quitar());
}
p.poner(q.quitar());

}

3. 

public static void eliminarRepetidoConsecutivo(Pila p){
Pila q = new Pila ();
q.poner(p.quitar());
while(!p.vacia()){
if(!p.cima().equals(q.cima())){
q.poner(p.quitar());
} else {
p.quitar();
}
}
while (!q.vacia()){
p.poner(q.quitar());
}
}

Apreciaciones importantes y reflexión:

En el primer metodo Se recibe la pila en la cual vamos a eliminar el primer elemento, se define una variable que recibira el dato que se quiere eliminar, luego se quita de la pila  cual elemento es el primero. Después de haber hecho esto  se imprimen los demás datos con una estructura repetitiva while.

En el segundo método  tambien se recibe una pila en la cual se cambiaran los elementos del extremo, se definen dos pilas que serviran de auxiliares llamadas q y r,  se quita el primer dato y se guarda en la pila q, luego se guradan los datos que quedan de la pila original a la otra pila auxiliar r, se guarda el dato que se encuentra en la pila q a la pila original p, luego es guardado el primer valor que se encuentra en la pila r a la pila q, se guardan los demas daos en la pila original, y es guardado también el dato que se encuentra en la pila r el cual anteriormente era el ultimo ahora es el primero.  

En el tercer método se tuvo en cuenta declarar una pila que sirve de auxiliar y tambien se recibe una pila, se saca el primer dato que trae la pila que recibe el metodo,  mediante un while se van sacando los demas datos, se va preguntando si el elemento que se saco es diferente al que esta en  la cima del original en caso de que esto se cumpla se pone en la pila q lo que va sacando de p, en caso de que no se cumpla se quita de la pila p y ese dato eliminado  automáticamente, luego se vuelve a mandar los datos en la forma que estaban a la pila original. 

Implementacion de Pila

 Implementacion de Pila.

1. Arreglos: Para realizar la implementacion de una pila por medio de arreglos es necesario definir tres variables las cuales son el vector de clase T (Genérico) y dos variables de clase int las cuales son el máximo y  tope. Se puede realizar operaciones como, poner, quitar, cima, vacía, llena. A continuación la clase PilaVector.

public class Pila <T>{
private T v[];
private int tope, max;
public Pila(){
max = 100;
v = (T[]) new Object[max];
tope = -1;
}
public Pila(int max){
this.max = max;
v = (T[]) new Object[max];
tope = -1;
}
public boolean vacia(){
return tope == -1;
}
public boolean llena(){
return tope == max-1;
}
public void poner(T dato){
if(!llena())
v[++tope] = dato;
else
System.out.println("La Pila Esta Llena");
}
public T quitar(){
T dato = null;
if(!vacia())
dato = v[tope--];
else
System.out.println("La Pila Esta Vacía");
return dato;
}
public T cima(){
if(!vacia())
return v[tope];
else
return null;
}


2. Nodos: Para la implementacion con Nodos se pueden realizar los siguientes métodos.

poner: tope = new Nodo(dato,tope);
quitar: dato = tope.getDato();
  tope= tope.getSig();
cima: dato=tope.getDato();
vacia: tope==null;

Apreciaciones importantes y reflexión: 

Aprendimos en la clase vista lo forma correcta de hacer que un vector se comporte como una pila, y resulta la clase mas funcional porque sirve para cualquier tipo de dato que se quiera guardar.