Java para encontrar si una matriz es un subconjunto de otra

Nov 24 2020

Tengo problemas para averiguar si una cantidad específica de números está en otra matriz. La primera matriz genera 10 números aleatorios y en la segunda matriz el usuario adivina 5 números. Estoy tratando de averiguar si el usuario adivinó alguna secuencia. bucles para averiguar si los números de entrada del usuario están en cualquiera de los números del 1 al 5 en la matriz de 10, si no, verificará los números del 2 al 6 y así sucesivamente. Por ejemplo, si el programa tiene los siguientes números ganadores: 23 56 67 06 43 22 59 24 90 66 y el usuario ingresó: 01 06 43 22 89. Sigo saliendo de los límites del índice. ¿Cómo puedo solucionar esto?

    // to check if user guessed a sequence
    
    boolean guessed = false;
    int counter = 0;
    int i , j = 0;
    
    for (i = 4; i < numbers.length; i++) {    // users numbers
        
        for ( j = 4; j < lottery.length; j++) {  // first 5 numbers from array 
            
            if ( lottery[i] == numbers[j]) {
                break;
            }
            if ( j == i) {
                guessed = true;
            }
        }
    }

Respuestas

1 AlexRudenko Nov 24 2020 at 20:50

Parece que se String::indexOfdebería implementar un método similar al en esta tarea para las matrices que intentan encontrar un índice de una submatriz int indexOf(int[] search, int[] input).

Además, podría ser necesario buscar todos los posibles subarreglos del searchsubarreglo ( lottery). Por lo tanto, el método mencionado debe extenderse para buscar un subrango del searchargumento:int indexOf(int[] search, int[] input)

La implementación sencilla sería:

static int indexOf(int search[], int from, int to, int[] input) {
    if (null == search || null == input || search.length > input.length) {
        return -1;
    }
    
    for (int i = 0, n = input.length - (to - from); i <= n; i++) {
        boolean found = true;
        for (int j = from; found && j < to; j++) {
            if (input[i + j - from] != search[j]) {
                found = false;
            }
        }
        if (found) {
            return i;
        }
    }
    return -1;
}

Los anchos y los índices apropiados from/ tode los subrangos de búsqueda se pueden generar de la siguiente manera (desde la longitud completa de lotteryhasta 2):

int[] numbers = {23, 56, 67, 06, 43, 22, 59, 24, 90, 66};
int[] lottery = {01, 06, 43, 22, 89};

for (int n = lottery.length; n > 1; n--) {
    for (int m = 0; m <= lottery.length - n; m++) {
        int ix = indexOf(lottery, m, m + n, numbers);
        if (ix > -1) {
            System.out.printf("Found subarray %s, width=%d from: %d to %d ",
                    Arrays.toString(Arrays.copyOfRange(lottery, m, m + n)), n, m, m + n - 1);
            System.out.printf("at index: %d%n", ix);
        }
    }
}

Salida

Found subarray [6, 43, 22], width=3 from: 1 to 3 at index: 3
Found subarray [6, 43], width=2 from: 1 to 2 at index: 3
Found subarray [43, 22], width=2 from: 2 to 3 at index: 4

Una implementación más eficiente usaría el algoritmo Knuth-Morris-Pratt para evitar las comprobaciones recurrentes de los mismos valores en la matriz de entrada.