Matrices dispersas (1): conversión Y29996


Statement
 

pdf   zip   tar

Una matriz dispersa (o esparcida) es una matriz en la que la mayoría de los elementos son cero. En lugar de almacenar todos los elementos, la representación dispersa guarda solo los elementos no nulos junto con sus posiciones, ahorrando memoria y tiempo de cómputo. Por ejemplo, la matriz:

(030000501007)\begin{pmatrix} 0 & 3 & 0 & 0 \\ 0 & 0 & 5 & 0 \\ 1 & 0 & 0 & 7 \end{pmatrix}

en representación dispersa por filas queda:

Fila 0: (1,3).
Fila 1: (2,5).
Fila 2: (0,1) (3,7).

donde cada par (col,val) indica la columna y el valor de cada elemento no nulo, y el punto final . marca el final de la fila (incluso cuando la fila está vacía).

En este problema, representamos una matriz de enteros con el tipo Matriu y la versión dispersa con el tipo MatriuEsparsa, definidos en matrius.hh:

typedef vector<vector<int>> Matriu;

struct Casella {
    int pos;    // índice de columna
    int valor;  // valor del elemento
};

struct MatriuEsparsa {
    int ncols;                   // número de columnas
    vector<list<Casella>> files; // filas de la matriz dispersa
};

Escribe la siguiente función:

/**
 * @brief Convierte una Matriu en una MatriuEsparsa.
 *
 * @param M Matriz rectangular de tamaño n x m.
 *
 * @pre M puede ser cualquier matriz rectangular (incluyendo vacía).
 * @post Devuelve una nueva MatriuEsparsa S, con S.ncols == m y S.files.size() == n,
 *       donde S.files[i] contiene, ordenadas por columna ascendentemente, las casillas
 *       {pos, valor} de los elementos no nulos de la fila i de M.
 */
MatriuEsparsa matriu_converteix_a_esparsa(const Matriu& M);

Observación

Los ficheros públicos (icono del gatito) contienen:

main.cc el programa principal, con la entrada/salida hecha
matrius.hh los tipos Matriu, Casella i MatriuEsparsa
Makefile para compilar con make cómodamente
.vscode carpeta para compilar y depurar con VSCode

Hay que enviar únicamente la implementación de la función matriu_converteix_a_esparsa, incluyendo el include de matrius.hh. No hace falta enviar el main.

Entrada

La primera línea contiene dos enteros nn y mm (0n,m10000 \leq n, m \leq 1000), el número de filas y columnas de la matriz. A continuación hay nn líneas, cada una con mm enteros separados por espacios que representan las filas de la matriz.

Salida

La primera línea contiene dos enteros nn y mm, las dimensiones de la matriz dispersa resultante. A continuación hay nn líneas, cada una con las casillas no nulas de la fila, en orden ascendente de columna, con el formato (col,val) separadas por espacios, seguidas de un punto .. Las filas sin ningún elemento no nulo se muestran únicamente con el punto ..

Public test cases
  • Input

    3 4
    0 3 0 0
    0 0 5 0
    1 0 0 7
    

    Output

    3 4
    (1,3).
    (2,5).
    (0,1) (3,7).
    
  • Input

    4 4
    1 0 0 2
    0 0 0 0
    0 -3 0 0
    5 0 6 0
    

    Output

    4 4
    (0,1) (3,2).
    .
    (1,-3).
    (0,5) (2,6).
    
  • Information
    Author
    Pau Fernández
    Language
    Spanish
    Translator
    Pau Fernández
    Original language
    Catalan
    Other languages
    Catalan
    Official solutions
    C++
    User solutions
    C++