目录
什么是稀疏矩阵
简单的说,如果一个矩阵中大部分元素为0,就被称为稀疏矩阵。
对于稀疏矩阵而言,实际存储的数据项很少。如果在计算机中采用传统的二维数组(在Python中使用二维列表)来存储稀疏矩阵,就会浪费大量的内存空间来存储0。比如一个10000 X 10000的稀疏矩阵,只有一个元素非0,若采用传统的存储技术,将浪费太多的内存来存储无意义的0。
稀疏矩阵的存储
对于稀疏矩阵,我们只需要记住矩阵中非0元素的位置和值、以及系数矩阵的大小(行数和列数)这些有用信息即可。也就是说,我们可以用一个包含3列的二维数组存储稀疏矩阵中的非0项,记录非0项的所在行、所在列和值信息以及记录稀疏矩阵行数和列数信息。
例如对于下面的3X3稀疏矩阵:
0 | 0 | 0 |
0 | 0 | 0 |
3 | 0 | 7 |
我们用下面的压缩矩阵来存储稀疏矩阵:
3 | 3 | 2 |
2 | 0 | 3 |
2 | 2 | 7 |
上面的压缩矩阵中,第0行(也就是标黄的部分)存储稀疏矩阵的行数(3)、列数(3)和非0项数据的个数(2)。
从第1行开始,存储非0项所在的行数、所在的列数和值。每一行存储一个非0项的信息。
示例题目
题目描述
输入一个稀疏矩阵,打印稀疏矩阵和压缩后的结果。
输入/输出描述
输入描述:
输入矩阵的行数和列数,在输入每一个位置对应的值。
例如下面输入了一个3 X 3的稀疏矩阵:
Input matrix rows: 3
Input matrix columns: 3
Input matrix[0][0]: 0
Input matrix[0][1]: 0
Input matrix[0][2]: 0
Input matrix[1][0]: 34
Input matrix[1][1]: 0
Input matrix[1][2]: 23
Input matrix[2][0]: 0
Input matrix[2][1]: 0
Input matrix[2][2]: 0
输出描述:
输出原矩阵和压缩后的稀疏矩阵:
------matrix------
| 0 0 0 |
| 34 0 23 |
| 0 0 0 |
---------------
After Compress matrix ---> sparse_matrix:
| 3 3 2 |
| 1 0 34 |
| 1 2 23 |
代码
# 声明稀疏元素和稀疏系数
SPARE_ELEMENT = 0
SPARE_RATE = 0.5
class MatrixError(Exception):
def __init__(self, message, code):
self.message = message
self.code = code
def isSparse(matrix):
"""
Judge spare matrix.
:param matrix: matrix
:return: boolean
"""
sum = len(matrix) * len(matrix[0])
spare = 0
for row in range(len(matrix)):
for column in range(len(matrix[row])):
if matrix[row][column] == SPARE_ELEMENT:
spare += 1
if spare / sum >= SPARE_RATE:
return True
els