A matrix is a two-dimensional data object with m rows and n columns, resulting in a total of m x n values. When most of the elements in a matrix have a value of 0, it is called a sparse matrix. Sparse matrices are common in various applications, such as scientific computing, graph algorithms, and machine learning.
Why Use Sparse Matrices?
- Storage Efficiency: Sparse matrices have fewer non-zero elements than zeros. Storing only the non-zero elements saves memory.
- Computational Efficiency: By focusing on non-zero elements, we can optimize computations and reduce processing time.
Array Representation
One way to represent a sparse matrix is using a 2D array. However, this approach leads to memory wastage since zeroes are irrelevant in most cases. Instead, we store only the non-zero elements using triples: (Row, Column, Value).
Example
Consider the following sparse matrix:
0 0 3 0 4 0 0 5 7 0 0 0 0 0 0 0 2 6 0 0
We can represent it as a compact matrix with three rows:
- Row: Index of the row where the non-zero element is located.
- Column: Index of the column where the non-zero element is located.
- Value: Value of the non-zero element.
#include <iostream>using namespace std;
int main() {
int sparseMatrix[4][5] = {
{0, 0, 3, 0, 4},
{0, 0, 5, 7, 0},
{0, 0, 0, 0, 0},
{0, 2, 6, 0, 0}
};
int size = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
if (sparseMatrix[i][j] != 0)
size++;
int compactMatrix[3][size];
int k = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
if (sparseMatrix[i][j] != 0) {
compactMatrix[0][k] = i;
compactMatrix[1][k] = j;
compactMatrix[2][k] = sparseMatrix[i][j];
k++;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < size; j++)
cout << " " << compactMatrix[i][j];
cout << "\\n";
}
return 0;
Output:
0 0 1 1 3 3 2 4 2 3 1 2 3 4 5 7 2 6
- Time Complexity: O(NM), where N is the number of rows and M is the number of columns in the sparse matrix.
- Auxiliary Space: O(NM)
Linked List Representation
Another approach is using linked lists. Each node contains four fields: Row, Column, Value, and a pointer to the next node.
#include <iostream>using namespace std;
class Node {
public:
int row;
int col;
int data;
Node* next;
};
// Create a new node
void create_new_node(Node** p, int row_index, int col_index, int x) {
Node* temp = *p;
Node* r;
if (temp == NULL) {
temp = new Node();
temp->row = row_index;
temp->col = col_index;
temp->data = x;
// ...
}
// ...
}
// Other linked list operations...
Remember to implement the linked list operations for a complete representation.
Conclusion
Sparse matrices provide efficient storage and computation for scenarios where most elements are zero. Choose the appropriate representation based on your application’s requirements.