Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ++c en 29 Abril 2015, 00:47 am



Título: ayuda con algoritmo divide and conquer
Publicado por: ++c en 29 Abril 2015, 00:47 am
Hola amigos,

me he dispuesto a resolver algoritmos de este tipo, concretamente comparar dos vectores y mostrar en que posición difiere un dato el uno del otro.

Primero me he dispuesto a comparar si los dos son iguales o no con el siguiente código:

Código
  1.  
  2.    public static boolean sonIgualesDyV(int[] a, int[] b, int ini, int fin) {
  3.        if(fin - ini <= 1) {
  4.            if((a[ini] != b[ini]) || (a[fin] != b[fin])) {
  5.                return false;
  6.            } else {
  7.                return true;
  8.            }
  9.        } else {
  10.            int medio = (ini + fin)/2;
  11.            boolean resultadoAux = sonIgualesDyV(a,b, ini, medio);
  12.            boolean resultadoAux2 = sonIgualesDyV(a, b, medio+1, fin);
  13.            return (resultadoAux && resultadoAux2);
  14.        }
  15.    }
  16.  
  17.    public static void main(String[] args) {
  18.        // TODO code application logic here
  19.  
  20.        int a[]={1,2,7,8,9,10};
  21.        int b[]={1,2,7,8,9,10};
  22.  
  23.        if (sonIgualesDyV(a,b,0, a.length-1))
  24.            System.out.println("Los vectores son iguales");
  25.         else
  26.            System.out.println("Los vectores no son iguales");
  27.    }
  28.  
  29.  

A partir de aquí y viendo que discurre la lógica implementada he querido modificarlo para devolver un entero con la posición donde difiere un dato de un vector de otro, ejemplo:

a[]={0,1,2,3,4}
b[]={0,1,2,3,6}

Ambos difieren en la posición 4 con un valor distinto por arreglo.

El problema lo tengo con las llamadas recursivas para llamarse a sí mismas y resolver el problema, antes devolvía dos resultados con un boolean(resultadoAux y resultadoAux2), ahora para devolver dos datos int no se como hacerlo... supongo que tendré que crear una condición para evaluar una llamada recursiva u otra o devolver con un arreglo los dos resultados a la llamada de la función...

Código
  1.  
  2.    public static int sonIgualesDyV(int[] a, int[] b, int ini, int fin) {
  3.        if(fin - ini <= 1) {
  4.            if((a[ini] != b[ini])){
  5.                return ini;
  6.            } else if ((a[fin] != b[fin])){
  7.                return fin;
  8.            }
  9.        } else {
  10.            int medio = (ini + fin)/2;
  11.            int resultadoAux = sonIgualesDyV(a,b, ini, medio);
  12.            int resultadoAux2 = sonIgualesDyV(a, b, medio+1, fin);
  13.  
  14.        }
  15.        return 0;
  16.    }
  17.  
  18.    public static void main(String[] args) {
  19.        // TODO code application logic here
  20.        int a[]={1,2,7,8,9,10};
  21.        int b[]={1,2,7,8,6,10};
  22.        System.out.println("Difiere en la posición: "+sonIgualesDyV(a, b, 0, a.length-1));
  23.    }
  24.  
  25.  

Saludos y muchas Gracias