import Foundation
// A sparse matrix is a matrix in which the majority of elements are zero.
// To compact a sparse matrix, use a method to store only the non‑zero
// entries using a triplet representation (row, column, value).
// This reduces memory usage.
// Convert a sparse matrix into compact (triplet) form
func compactMatrix(_ matrix: [[Int]]) -> [[Int]] {
let rows = matrix.count
let cols = matrix[0].count
// Count non-zero elements
let count = (0..<rows).reduce(0) { acc, i in
acc + (0..<cols).filter { j in matrix[i][j] != 0 }.count
}
// Compact matrix has 3 rows: row index, col index, value
var compact = Array(repeating: Array(repeating: 0, count: count), count: 3)
var k = 0
// Fill compact matrix
for i in 0..<rows {
for j in 0..<cols {
if matrix[i][j] != 0 {
compact[0][k] = i // row
compact[1][k] = j // column
compact[2][k] = matrix[i][j] // value
k += 1
}
}
}
return compact
}
let matrix = [
[0, 0, 3, 0, 8, 0, 0, 0, 0],
[0, 0, 5, 7, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 6, 0, 0, 4, 0, 0, 0],
[0, 0, 0, 0, 9, 0, 0, 0, 0]
]
let compact = compactMatrix(matrix)
print("Compact matrix:")
for i in 0..<3 {
print(compact[i].map { String($0) }.joined(separator: " "))
}
/*
run:
Compact matrix:
0 0 1 1 1 3 3 3 4
2 4 2 3 6 1 2 5 4
3 8 5 7 1 2 6 4 9
*/