当前位置: 首页 > Web前端 > HTML

如何编写高性能代码(三):使用稀疏矩阵节省内存使用

时间:2023-03-28 18:56:19 HTML

稀疏矩阵的概念一个m×n矩阵是一个元素排列成m行n列的矩形数组。矩阵中的元素可以是数字、符号和其他类型的元素。一般来说,在一个矩阵中,如果值为0的元素的个数远多于非零元素的个数,且非零元素分布不规则,则称该矩阵为稀疏矩阵;相反,如果非零元素的个数占多数时,该矩阵称为稠密矩阵。矩阵的密度定义为非零元素总数与矩阵所有元素总数的比值,下面的矩阵就是一个典型的稀疏矩阵。我们日常使用的电子表格也是典型的稀疏矩阵场景。电子表格(SpreadJS、Excel、GoogleSheet等)整体看起来就像一个表格,其中列名为A、B、C……,行名为1、2、3……以极端场景为例,在单元格中赋值A1和ZZ2000,所以我们需要一个2000行,26*26+26=702的矩阵来表示它,这个矩阵是一个明显的稀疏矩阵。稀疏矩阵存储和优化直接存储为二维矩阵使用二维矩阵直接存储整个电子表格简单直接,因此您不必每次都创建或删除一块内存。但是这是一种很暴力的存值方式,会消耗大量的内容来存储空cell。简单看一下它的复杂度:占用空间:O(N2)插入数据:需要销毁矩阵。删除数据:需要销毁矩阵。搜索数据:O(N2)访问数据:O(1)N假设行和列具有相同的长度并形成方阵的行/列数。通过键值对优化(Map,Dictionary)在这种方法中,只有当单元格有值时,我们将单元格的值和位置存储在一起,这可以使用HashMap或Dictionary等数据结构轻松完成。作为我们可以在下图中看到,单元格位置和单元格值分别存储在键值对中。看一下它的复杂度:空间:O(N)插入:O(1)删除:O(1)查找:O(N)访问:O(1)N是记录的条目数。OptimizationbySparseMatrixStorage在稀疏矩阵中,我们可以使用三个不同的数组来存储行索引,列偏移,以及其中的值,而不是直接在二维矩阵中存储值。稀疏矩阵存储的三个数组按列压缩是这样的:value=>valueincell。行索引=>单元格的行索引。ColumnOffset=>这里每个索引代表一列,数组存储Row数组中行开始的索引值。稀疏矩阵的具体插入、删除、查找、访问代码,大家可以自行搜索。网上有很多这方面的资料,这里就不一一列举了。如上,我们来看看这种方式的复杂度:空间:O(N)插入:O(N)删除:O(N)搜索:O(N)访问:O(1)与传统数组相比存储或键值对存储。稀疏矩阵存储以行索引为Key构建数据字典。在松散布局的表格数据中,稀疏矩阵只会存储非空数据,而不会为空数据开辟额外的数据。内存空间。使用这种特殊的存储策略使得数据分片变得容易,你可以随时在整个数据层中分帧一段数据进行序列化或反序列化。如果我们在项目开发中需要存储类似结构的数据,稀疏矩阵的存储方式可以大大提高时间和空间上的性能。在葡萄城的SpreadJS和GcExcel表格组件中,也巧妙地利用了稀疏矩阵的特性,可以随时替换或恢复整个存储结构中的任何一级节点,通过改变引用回滚和更高效地解决表格数据恢复问题,这也为葡萄城表组件支持多人在线协作打下了良好的基础。由于底层采用稀疏矩阵优化存储,SpreadJS在前端页面实现了百瓦级数据秒级响应能力:纯前端百万级数据请求、加载、筛选、排序点击这里在线体验:同时进行性能演示,结合SpreadJS中使用的Canvas绘图模型、双缓冲画布渲染等专利技术,SpreadJS的前端性能遥遥领先于同类产品。更多在线纯前端表格demo示例:https://demo.grapecity.com.cn...纯前端表格应用场景:https://www.grapecity.com.cn/...移动端例子(可扫码体验):http://demo.grapecity.com.cn/...