Volem disposar d’una classe que permeti treballar amb matrius esparses. En aquest problema, una matriu esparsa és un matriu quadrada on la majoria dels seus elements són zero.
Per representar una matriu esparsa eficientment, s’utilitza un vector d’ llistes, de forma que la llista conté una successió de valors (ordenats per ) que representen els valors de la matriu que no són zero.
Per exemple, la matriu
es representa per un vector de quatre llistes:
0 :
1 :
2 :
3 :
on denota l’end() d’una llista.
Les operacions públiques de la classe permeten:
Construir una matriu de mida plena de zeros.
Consultar el valor d’una posició determinada d’una matriu (@get@).
Modificar el valor d’una posició determinada d’una matriu (@set@). Per senzillesa, el nou valor no pot ser zero.
Sumar una matriu a una altra (@add@).
Escriure la matriu en format estàndard (@print@).
L’esquelet de la classe i el programa principal ja se us dona implementat (descarregueu el fitxer code.cc). Heu de completar les funcions de consulta (@get@), modificació (@set@) i de suma (@add@), sense canviar la interfície de les funcions, ni alterar la definició de les dades. A més, aquestes funcions no es poden cridar entre elles.
Les vostres implementacions han de ser eficients en el cas de matrius amb molt pocs elements diferents de zero: Suposant que el nombre d’elements no zero d’una matriu sigui $\text O(n)$, les vostres operacions han de tenir cost $\text O(n)$ en el cas pitjor.
Input
create a 4 print a # set a 0 0 3 set a 0 2 4 set a 1 1 6 set a 1 3 1 set a 3 1 2 print a # get a 0 0 get a 0 1 # create b 4 set b 0 0 -3 set b 2 3 9 print b # add a b print a
Output
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 4 0 0 6 0 1 0 0 0 0 0 2 0 0 3 0 -3 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 4 0 0 6 0 1 0 0 0 9 0 2 0 0