miércoles, 2 de abril de 2014

Examen Programación de Sistemas y Concurrencia Curso 2013 (Parte de Java)

Buenas gente. Aquí me hallo preparando el examen de esta asignatura, que toca este jueves. Acabo de hacer el ejercicio de java del examen del 2013 y os lo traigo aquí.

Como siempre aquí teneis el enunciado y aquí la clase usada. Procedo a copiaros el enunciado:


Diseña un programa java que implemente un algoritmo de búsqueda de un número int valor en un array de enteros int[] vector de forma recursiva y concurrente. El programa debe construir un árbol binario de hebras, de profundidad variable, que depende del número de componentes de vector. El sistema sólo necesita una clase Nodo que se comporta como se describe a continuación.
 Inicialmente, el método main() crea un primer nodo (el nodo raíz del árbol) al que se le pasa un array vector de números aleatorios. Cada uno de los nodos que se vayan creando en el sistema se comporta de la misma forma. Si el vector que se le pasa al nodo en el constructor tiene 0 o 1 elementos, es trivial comprobar si el valor está en el array. En otro caso, la hebra crea dinámicamente dos nuevas hebras, y le pasa a cada una de ellas una de las dos mitades del vector. Una vez que cada hebra hija ha buscado el valor en su mitad, la hebra padre comprueba si valor estaba en alguna de las dos mitades, y devuelve el resultado correspondiente. Como ayuda para la implementación, se sugiere la siguiente estructura para el constructor de la clase Nodo y el método main:

public Nodo(int[] vector,int inic,int fin,int valor,boolean[] res){ 
// busca "valor" en vector[inic..fin-1] y deja el resultado en res[0] 
 .... 
} 
 
public static void main(String[] args){ 
 Random r = new Random(); 
 int[] vector = new int[r.nextInt(20)+1]; 
 for (int i = 0; i<vector.length; i++){ 
 vector[i] = r.nextInt(20); 
 } 
 int valor = r.nextInt(20); 
 System.out.println("Buscamos "+valor+" en "+Arrays.toString(vector)); 
 boolean[] res = new boolean[1]; 
 Nodo nodo = new Nodo(vector,0,vector.length,valor,res); 
 .... 
 
} 

La verdad es que no tengo ni idea de por qué te piden el booleano en un array, pero así lo pedían y así lo he hecho :P

Aquí teneis la class resuelta:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;


public class Nodo extends Thread{
 
 private int[] vector;
 private int inic, fin, valor;
 private static volatile boolean[] res;
 
 public Nodo(int[] vector,int inic,int fin,int valor,boolean[] res){ 
  // busca "valor" en vector[inic..fin-1] y deja el resultado en res[0] 
   this.vector = vector;
   this.inic = inic;
   this.fin = fin;
   this.valor = valor;
   this.res = res;
  } 
 
 public void run(){

  // Como la variable res es static, es la misma para todos los objetos
  // Además como es volatile, si cambia en un objeto se actualiza a todos.
  if(!res[0]) {
   
   if((fin-inic)>1) {
    //Creamos dos nodos para ver los valores.
    Nodo n1 = new Nodo(vector, inic, (inic+((fin-inic)/2)), valor, res );
    Nodo n2 = new Nodo(vector, (inic+((fin-inic)/2)), fin, valor, res );
    
    n1.start();
    n2.start();
    
    try {
     n1.join();
     n2.join();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }    
    
   } else {
    if(vector[inic]==valor)
     res[0] = true;
   }
   
  }
  
 }
 
 
 
 
 
 
   
  public static void main(String[] args){ 
   Random r = new Random(); 
   int[] vector = new int[r.nextInt(20)+1]; 
   for (int i = 0; i<vector.length; i++){ 
   vector[i] = r.nextInt(20); 
   } 
   int valor = r.nextInt(20); 
   System.out.println("Buscamos "+valor+" en "+Arrays.toString(vector)); 
   boolean[] res = new boolean[1]; 
   Nodo nodo = new Nodo(vector,0,vector.length,valor,res); 
   
   nodo.start();
   
   try {
   nodo.join();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   
   System.out.println(res[0]);
   
   //Por si fallara, que se viera.
   Set<Integer> set = new HashSet<>();
   for(int i : vector) {
    set.add(i);
   }
   
   if(set.contains(valor) != res[0]) {
    System.out.println("ERROOOOOOOR");
   }
  } 
  

}
 
 
Bueno. Espero que comentéis si encontráis una forma mejor o si tenéis alguna duda.

Saludos ;)

No hay comentarios:

Publicar un comentario