一样平常来说,在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。下面的矩阵便是一个范例的稀疏矩阵:
优化稀疏矩阵数据存储的方法
1.直接存储为二维矩阵
利用二维矩阵作为电子表格的存储方法具有大略直接的优点,可以避免频繁地创建或删除内存段。然而,须要指出的是,这种办法在存储值时可能会有一些不太高效的方面,由于它会占用大量的存储空间来保存没有实际内容的单元格。

在实际运用中常日利用三元组表示稀疏矩阵:
三元组的表示方法是:对付一个 m×n 的稀疏矩阵 A,我们只存储矩阵中非零元素的信息,详细来说,将每个非零元素的行下标、列下标和值存储下来,得到一个三元组(i,j,Ai,j),个中 i 是行下标,j 是列下标,Ai,j 是 A 中对应位置的值。
以前面举的稀疏矩阵为例,其三元组表示如下:
Plain Text(1, 4, 6)(2, 2, 5)(3, 3, 4)
直接存储为二维矩阵的繁芜度:
占用空间:O(N2) 。插入数据:须要毁坏矩阵。删除数据:须要毁坏矩阵。搜索数据:O(N2)。访问数据:O(1)。N是假设行和列具有相同长度并形成正方形矩阵的行/列数。
2.通过键值对(Map, Dictionary)优化
通过键值对(Map, Dictionary)来优化,紧张是利用哈希表的特性来快速查找元素。详细来说,可以将须要查找的元素作为键,将存储这些元素的数据构做作为值,然后将它们存储在一个哈希表中。这样,当须要查找某个元素时,只须要利用该元素作为键,通过哈希表的查找操作即可快速找到对应的值。
在实际运用中,常见的情形包括:
缓存数据:在须要频繁访问数据的场景中,通过建立一个缓存,将数据存储在一个键值对的数据构造中,可以显著提高数据的访问效率。字符串处理:在须要对字符串进行匹配、查找等操作的场景中,可以将字符串作为键,将相应的处理结果作为值,存储在一个键值对的数据构造中,可以大幅提高字符串处理的效率。数据库操作:在须要对数据库进行访问的场景中,可以利用键值对数据构造来存储查询结果,避免重复实行查询操作,减轻数据库的负载。不才图中,将单元格位置和对应的单元格值以键值对的形式进行了存储。
通过键值对(Map, Dictionary)优化稀疏数组的繁芜度:
空间:O(N)。插入:O(1)。删除:O(1)。搜索:O(N)。访问:O(1)。N为所记录的条款数。
3.通过数组存储办法优化
在稀疏矩阵中,我们可以利用三个不同的数组来存储行索引、列偏移、和个中的值,而不是直接在二维矩阵中存储值。
存储的三个数组:
值 =>单元格中的值。行索引=>单元格的行索引。列偏移=>这里每个索引都代表列,并且该数组将行开始的索引值存储在 Row 数组中。下图为将稀疏数组转化为数组的形式:
稀疏矩阵详细的插入,删除,搜索,访问的代码:
Javaimport java.util.HashMap;import java.util.Map;class SparseMatrix {private int rows;private int cols;private Map<String, Integer> matrix;public SparseMatrix(int rows, int cols) {this.rows = rows;this.cols = cols;this.matrix = new HashMap<>();}public void insert(int row, int col, int value) {if (row < 0 || row >= rows || col < 0 || col >= cols) {throw new IndexOutOfBoundsException("Invalid matrix index");}if (value != 0) {String key = row + "," + col;matrix.put(key, value);}}public void delete(int row, int col) {String key = row + "," + col;matrix.remove(key);}public int search(int row, int col) {String key = row + "," + col;return matrix.getOrDefault(key, 0);}public int access(int row, int col) {if (row < 0 || row >= rows || col < 0 || col >= cols) {throw new IndexOutOfBoundsException("Invalid matrix index");}String key = row + "," + col;return matrix.getOrDefault(key, 0);}}
在上述代码中,定义了一个 SparseMatrix 类来表示稀疏矩阵。在布局函数中,我们传入矩阵的行数和列数,并创建了一个 HashMap 工具 matrix 来存储非零元素。insert 方法用于向矩阵中插入元素,如果插入的值不为零,则将其加入 matrix 中,个中键为字符串形式的 row,col。delete 方法用于删除指定位置的元素,通过 remove 方法从 matrix 中移除对应的键值对。search 方法用于搜索指定位置的元素,通过调用 getOrDefault 方法从 matrix 中获取对应的值,如果不存在则返回默认值 0。access 方法用于访问指定位置的元素,如果超出矩阵边界则抛出非常,通过调用 getOrDefault 方法从 matrix 中获取对应的值。
通过稀疏矩阵存储办法优化的繁芜度:
空间:O(N)。插入:O(N)。删除:O(N)。搜索:O(N)。访问:O(1)。总结相较于传统的数组存储或键值对存储,稀疏矩阵存储采取一种基于行索引的数据字典存储方法,这种方法在处理松散布局的表格数据时表现出色。与其他存储办法不同,稀疏矩阵只存储非空数据,无需额外开辟内存空间来存储空数据。这种分外存储策略使得数据片段化变得随意马虎,可以随时框取全体数据层中的一片数据进行序列化或反序列化。如果在项目开拓中须要存储类似构造的数据,利用稀疏矩阵存储办法能够显著提升性能,无论从韶光还是空间上都有很大的上风。
如果想理解更多干系技能干货,可以持续关注本账号~