首页 » PHP教程 » php数组占内存技巧_技能干货稀疏数组若何资助我们节省内存提升机能

php数组占内存技巧_技能干货稀疏数组若何资助我们节省内存提升机能

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

一样平常来说,在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
下面的矩阵便是一个范例的稀疏矩阵:

优化稀疏矩阵数据存储的方法

1.直接存储为二维矩阵

php数组占内存技巧_技能干货稀疏数组若何资助我们节省内存提升机能

利用二维矩阵作为电子表格的存储方法具有大略直接的优点,可以避免频繁地创建或删除内存段。
然而,须要指出的是,这种办法在存储值时可能会有一些不太高效的方面,由于它会占用大量的存储空间来保存没有实际内容的单元格。

php数组占内存技巧_技能干货稀疏数组若何资助我们节省内存提升机能
(图片来自网络侵删)

在实际运用中常日利用三元组表示稀疏矩阵:

三元组的表示方法是:对付一个 m×n 的稀疏矩阵 A,我们只存储矩阵中非零元素的信息,详细来说,将每个非零元素的行下标、列下标和值存储下来,得到一个三元组(i,j,Ai,j),个中 i 是行下标,j 是列下标,Ai,jA 中对应位置的值。

以前面举的稀疏矩阵为例,其三元组表示如下:

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)。
总结

相较于传统的数组存储或键值对存储,稀疏矩阵存储采取一种基于行索引的数据字典存储方法,这种方法在处理松散布局的表格数据时表现出色。
与其他存储办法不同,稀疏矩阵只存储非空数据,无需额外开辟内存空间来存储空数据。
这种分外存储策略使得数据片段化变得随意马虎,可以随时框取全体数据层中的一片数据进行序列化或反序列化。
如果在项目开拓中须要存储类似构造的数据,利用稀疏矩阵存储办法能够显著提升性能,无论从韶光还是空间上都有很大的上风。

如果想理解更多干系技能干货,可以持续关注本账号~

标签:

相关文章

大数据三幡,新时代信息时代的智慧之光

随着信息技术的飞速发展,大数据已成为国家战略资源,被誉为“数字石油”。大数据三幡,即数据采集、数据处理和数据分析,是大数据应用的核...

PHP教程 2024-12-15 阅读0 评论0

收单平台php技巧_基于微信的支付分账筹划

第一,商家的交易收入直接进入到平台的账上,如果平台未具备支付牌照,这种办法会存在“二清”问题,不合法律法规;第二,由于须要采取平台...

PHP教程 2024-12-15 阅读0 评论0